带有CodeIgniter的用户权限系统

时间:2018-08-02 18:36:08

标签: php codeigniter acl

我正在使用CodeIgniter重新开发系统,这是我的新手,并且正尝试从Controller加载一个函数,该函数将检查用户是否具有查看/访问该功能的权限。 / p>

我在数据库中使用TEXT并拥有每个用户级别的所有权限,然后将这些权限保存到会话变量中,以便在Controller中使用。

在我的控制器Users.php中:

public function UserHasPermissions($permission){
    checkSession($this);

    $arrayPermissions = explode($this->sessions->userdata('session_permissions'));
    if(in_array($permission, $arrayPermissions)){
        return true;
    } else {
    return false;
    }
}

在我的观点home.php中,我正在尝试以下操作:

$this->load->view('commons/header');
if($this->Users->UserHasPermissions('ADD_MEETING')){
    echo 'content';
}
$this->load->view('commons/footer');

它返回此错误:

An uncaught Exception was encountered
Type: Error

Message: Call to a member function UserHasPermissions() on null

Filename: /var/www/html/DF_CHECKER_CI/application/views/home.php

Line Number: 4

我看了看这些文档,但没有什么对我有太大帮助。

https://www.codeigniter.com/user_guide/general/views.html#adding-dynamic-data-to-the-view

How to call codeigniter controller function from view

2 个答案:

答案 0 :(得分:1)

通过尝试从视图中调用控制器来破坏MVC,您应该改为在呈现视图的方法或类构造函数中确定用户在呈现视图之前对控制器具有的权限。话虽如此,除非您引用单例CI实例,否则您无法从CI中的视图调用控制器:

$ci = &get_instance();

$this->load->view('commons/header');
if($ci->UserHasPermissions('ADD_MEETING')){
    echo 'content';
}
$this->load->view('commons/footer')

但是,这将产生错误:

  

类用户的对象无法转换为字符串

这是一种方法:

class Users extends CI_Controller{ //or whatever you're doing here

   public function __construct()
   {
       // you can check all permissions here if you'd like
   }
   /**or**/
   /**whatever is responsible for calling your view**/
   public function index()
   {
      $data['has_permission'] = $this->userHasPermissions('ADD_MEETING');
      $this->load->view('home',$data); 
   }

   private function userHasPermissions($permission)
   {
       return in_array($permission, $this->sessions>userdata('session_permissions'));
   }
}

在您看来:

<?if($has_permission):?> 
<--show content-->
<?endif;?>

答案 1 :(得分:0)

  1. 除非您使用的是Smarty之类的模板引擎,否则不应在视图中加载视图
  2. 您不能像使用库/模型方法那样访问控制器方法(我认为如果您使用的是HMVC,也许可以,但是显然不是)

您可以创建模型或帮助程序或库。尽管模型/助手会更适合。这是相对容易的,尤其是如果您以前曾以任何能力使用过CI的话。

唯一需要注意的是,如果使用帮助程序,则必须像在函数$CI = &get_instance();中那样访问CI实例,然后才能像$CI->load->database(); $CI->db->get('users')->result();之类的方式使用它。