【问题标题】:CodeIgniter restricted page for admin users onlyCodeIgniter 仅限管理员用户的受限页面
【发布时间】:2015-04-12 10:52:34
【问题描述】:

我正在将 Code Igniter 用于 Web 项目。

我有两个不同的用户,一个基本用户和一个管理员用户。

我只是通过在我的数据库中有一个名为 admin 的列等于“是”或“否”来区分管理员用户和基本用户

我有两个控制器,一个控制器纯粹用于登录验证(login.php),另一个用于网页管理等(site.php)。

我想让页面只对管理员用户可用。这是我的登录控制器中我的代码的 sn-p,它当前在成功登录时重定向我的用户以及设置会话数据。..

   if ($this->input->post('btn_login') == "Login")
   {
        //check if username and password is correct
        $usr_result = $this->login_model->get_user($username, $password);
        if ($usr_result) //active user record is present
        {
             //set the session variables
             $sessiondata = array(
                  'username' => $username,
                  'loginuser' => TRUE
             );
             $this->session->set_userdata($sessiondata);
             if($usr_result->admin == 'Yes')
                  redirect("site/admin");
             else
                  redirect("site/agent");
        }

这是我的主控制器的 sn-p,它管理我的页面等(site.php):

public function admin(){
        $data["title"]="My Admin";
        $this->load->model("notifications");

        if ($this->session->userdata('loginuser')){
            $this->load->view("site_header");
            $this->load->view("site_nav");
            $this->load->view('adminpage', $data);
            $this->load->view("site_footer");
        } else {
            redirect('site/restricted');
        }
    }

    public function restricted(){
        $this->load->view("restricted");
    }

现在你可以从我上面的 sn-p 中看到方法 admin() 我有一个 if 语句,只有登录用户才能登录到这个页面,否则显示受限页面。

如何更改此代码以仅允许具有列 admin = Yes 的用户访问此页面?目前我所有的用户管理员都可以访问这个页面。

我希望这是有道理的,提前谢谢你!

【问题讨论】:

  • 通常我会在登录后的会话中保存user_id。我使用 user_id 进行查询,它将为我提供用户信息。现在我检查此 user_id 是否有权访问此方法或控制器。我建议使用@bandrei2408 答案。您可以在会话中存储user_id 而不是username。其他解决方案也不错

标签: php codeigniter authentication login


【解决方案1】:

您需要将管理结果保存到会话数据数组中

因此,如果用户是管理员,您只需添加

 if($usr_result->admin == 'YES'){
      $admin = true;
 }else{
      $admin = false;
 }
 $sessiondata = array(
              'username' => $username,
              'loginuser' => TRUE,
              'admin' => $admin
         );

然后您只需在下一页检查它

 if ($this->session->userdata('admin')){

【讨论】:

  • 嗨,斯蒂芬,这不太行 :/ .......它仍然允许非管理员用户(管理员列 =“否”)登录到此页面,除非我错过了一些东西:/
【解决方案2】:

如果您想为控制器中的所有操作设置它,请将此构造函数添加到您的控制器中

//If you want to have the user into a variable
private $currentUser; 

public function __construct(){
  $this->load->model('login_model');
  $username = $this->session->userdata('username');
  $usr_result = $this->login_model->get_user_by_username($username);
  if(!$usr_result->admin)
    die; //or redirect to page not available
  //If you want to have the user into a variable
  $this->currentUser = $usr_result;
}

在您的 login_model 中创建一个新方法 get_user_by_username,它将通过用户名返回用户。如果您没有唯一的用户名,请在会话中添加用户的 id,并在您的模型中创建一个名为 get_user_by_id 的方法,该方法将通过其 id 返回用户。

希望它是您正在寻找的。这样您就不必设置管理会话。

L.E.对史蒂文所说的,修改如下:

$sessiondata = array(
          'username' => $username,
          'loginuser' => TRUE,
          'admin' => $usr_result->admin
);

【讨论】:

  • 这段代码比我对这个页面的回答更干净。但是,然后你有一个字符串而不是布尔值。哪个也可以。两者之间的一个很好的折衷方案是分配一些代码来将值设置为真或假。然后在下一页你仍然可以只做 if(if ($this->session->userdata('admin')))
  • 对不起,我在帖子中提到了它,但我无法评论你的(没有足够的声誉)。
  • 谢谢@StevenDStanton,我会记住这一点,此外,我已将您的答案标记为有用,因为它为我提供了解决问题的基线,但是 bandrei2408 编辑的答案给了我答案查询,但谢谢你们!
【解决方案3】:

在您的登录功能中:

//set the session variables
$sessiondata = array('user' => $usr_result); //This you'll be able to access all your user info at anytime.
$this->session->set_userdata($sessiondata);

在你的主控制器中:

if ($this->session->userdata('user') && $this->session->userdata('user')->is_admin == "Yes")

或者,更具可读性:

$myUser = $this->session->userdata('user');
if ($myUser && $myUser->is_admin == "Yes")

您无需设置'loginuser' => TRUE。如果有会话,那是因为您的用户已登录。因此您只需检查会话是否已设置,即可知道您的用户是否已登录。

【讨论】:

  • 感谢@AdrienXL,其他答案的组合已经回答了我的问题,无论您的建议如何,我们都非常感谢。
【解决方案4】:

你必须添加

if($usr_result->admin == 'YES'){
  $admin = true;
}else{
  $admin = false;
}

那么它应该正确地相等。 卡斯米

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    相关资源
    最近更新 更多