CodeIgniter限制页面仅供管理员用户使用


CodeIgniter restricted page for admin users only

我正在为一个web项目使用Code Igniter。

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

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

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

我想让网页只对管理员用户可用。这是我的登录控制器中的一段代码,该控制器当前在成功登录时重定向我的用户,并设置会话数据。。

   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");
        }

这是我的主控制器的一个片段,它管理我的页面等(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");
    }

现在,您可以从上面的方法admin()的代码片段中看到,我有一个if语句,只允许登录的用户登录到该页面,否则将显示受限页面。

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

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

在您的登录功能中:

//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。如果有会话,那是因为你的用户已经登录。所以你只需要检查是否设置了会话,就可以知道你的用户是否已经登录。

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

//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($usr_result->admin == 'YES'){
      $admin = true;
 }else{
      $admin = false;
 }
 $sessiondata = array(
              'username' => $username,
              'loginuser' => TRUE,
              'admin' => $admin
         );

然后你只需要在下一页上查看它

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

您必须添加

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

那么它应该简洁地相等。kasmey