CodeIgniter仅限管理员用户的限制页面

时间:2015-02-11 21:39:04

标签: php codeigniter authentication login

我正在使用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列的用户才能访问此页面?目前我的所有用户管理员都可以访问此页面。

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

4 个答案:

答案 0 :(得分:3)

您需要将管理结果保存到会话数据阵列

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

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

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

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

答案 1 :(得分:3)

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

//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的方法,该方法将按用户的身份返回用户。

希望这就是你要找的东西。这样您就不必设置管理会话。

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

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

答案 2 :(得分: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。如果有会话,那是因为您的用户已登录。所以您只需要检查会话是否已设置,以了解您的用户是否已登录。

答案 3 :(得分:0)

你必须添加

if($usr_result->admin == 'YES'){
  $admin = true;
}else{
  $admin = false;
}
那么它应该等于核心。 kasmey

相关问题