首页 > 解决方案 > 使用 CodeIgniter 的用户权限系统

问题描述

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

TEXT在我的数据库中使用每个用户级别拥有的所有权限,然后将权限保存到我的控制器中使用的会话变量中。

在我的控制器中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

如何从视图中调用 codeigniter 控制器功能

标签: phpcodeigniteracl

解决方案


您通过尝试从视图调用控制器来破坏 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;?>

推荐阅读