2015-02-11 125 views
3

我正在使用Code Igniter作为Web项目。仅供管理员用户使用的CodeIgniter受限制页面

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

我只是通过在我的数据库名为admin列相等于“是”或“否”

我有两个控制器,一个控制器是纯粹进行登录认证(登录区分具有基本的用户管理用户.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"); 
     } 

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

现在你可以看到从我的片段上方的方法管理员()我必须只在用户登录到该页面的其他限制时显示的页面记录一个if语句。

我该如何更改此代码以允许只有拥有列admin = Yes的用户才能访问此页面?由于目前我的所有用户都管理或不能访问此页面。

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

+0

正常情况下,我登录后在会话中保存'user_id'。我用user_id做了一个查询,它会给我用户信息。现在我检查这个user_id是否有权访问这个方法或控制器。我建议使用@ bandrei2408答案。你可以在会话中存储'user_id'而不是'username'。其他解决方案也不错 – 2015-02-11 22:52:54

回答

3

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

因此,如果用户是管理员,你想补充

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

然后你只需检查它的下一个

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

我同意。这听起来像一个很好的答案 – CodeGodie 2015-02-11 22:00:00

+0

嗨斯蒂芬,这并不工作:/ .......它仍然允许用户不是管理员(列管理=“否”)登录到此页面,除非我错过了一些东西:/ – 2015-02-11 22:01:32

+0

Adbush。我将编辑我上面的回复,以使其更清晰 – StevenDStanton 2015-02-11 22:12:32

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的方法,该方法将通过其ID返回用户。

希望这是你在找什么。这样你不必设置管理会话。

L.E.什么史蒂芬说,修改如下:

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

此代码比我在此页面的回复更清晰。然而,你有一个字符串,而不是一个布尔值。哪个可以工作。两者之间的一个很好的折衷办法是分配一些代码来将值设置为true或false。然后在下一页你仍然可以做if(if($ this-> session-> userdata('admin'))) – StevenDStanton 2015-02-11 22:06:47

+0

对不起,我在我的文章中提到过,但我不能评论你的足够的声誉)。 – bandrei2408 2015-02-11 22:10:59

+0

Thank you @ bandrei2408 – 2015-02-11 22:12:01

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。如果有会话,那是因为您的用户已登录。所以您只需检查会话是否已设置,或不知道您的用户是否已登录。

+1

感谢这@AdrienXL其他答案的组合已经回答了我的问题,无论谢谢你的建议,我很感激。 – 2015-02-11 22:15:12

0

你必须添加

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

那么它应该corectly相等。 kasmey

+0

相同的答案已发布数周前:) – mcserep 2015-02-25 23:31:56

相关问题