【问题标题】:ACL (Access Control List) Codeigniter by User ID not by RolesACL(访问控制列表)Codeigniter 按用户 ID 而不是按角色
【发布时间】:2018-12-10 08:16:24
【问题描述】:

我尝试创建 ACL(访问控制列表)但按用户 ID,而不是按角色 因为客户想要相同的级别,但有不同的权限

如何检查用户是否访问了在数据库中没有权限的方法或控制器

这里是表权限结构

+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| permission_id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| permission_name        | varchar(255) | NO   |     | NULL    |                |
| permission_desc        | text         | YES  |     | NULL    |                |
| permission_created_at  | datetime     | YES  |     | NULL    |                |
| permission_modified_at | datetime     | YES  |     | NULL    |                |
+------------------------+--------------+------+-----+---------+----------------+

那么,permissions 表与 permission_role 表有关系 这是permission_role的结构

+--------------------+---------+------+-----+---------+----------------+
| Field              | Type    | Null | Key | Default | Extra          |
+--------------------+---------+------+-----+---------+----------------+
| permission_role_id | int(11) | NO   | PRI | NULL    | auto_increment |
| user_id            | int(11) | NO   | MUL | NULL    |                |
| permission_id      | int(11) | NO   | MUL | NULL    |                |
+--------------------+---------+------+-----+---------+----------------+

现在,如果用户访问用户无权访问它的控制器,我会感到困惑,我该如何检查它?如果通过路由或 URI 检查但我的数据库没有保存类控制器... 请问有什么解决办法吗?

谢谢你,对不起我的英语不好

【问题讨论】:

  • 可以显示permissions表的数据吗?
  • @Yogendrasinh 这里是:postimg.cc/zbVkWn4M,这里是 权限角色数据:postimg.cc/bdqb2X2n
  • 根据您的permissions 表列permission_name 包含模块名称及其在括号中的方法。你的控制器名称怎么样。 Department(View) 的控制器名称和方法名称是什么?
  • 那么,我们通过 URI 检查权限?并在方法上一一调用?
  • 您能告诉我们您数据库中Department (view) 的控制器名称和方法名称是什么吗?

标签: php mysql codeigniter acl


【解决方案1】:

假设Branch .etc。是控制器,viewedit 是您的存储系统必须执行的方法:

class Branch extends CI_Controller {

     public function view {
         $this->acl->can_access(6);
     }

     public function edit {
         $this->acl->can_access(9);
     }
}

Acl 模型:

class Acl extends CI_Model {

     public function can_access($permission_id = null) {
         $uid = $this->session->userdata('user_id');
         if (!is_null($uid) && !is_null($permission_id)) {
             $this->db->where('user_id', $uid);
             $this->db->where('permission_id', $permission_id);
             $this->db->from('permissions_role');
             if ($this->db->count_all_results() > 0) {
                 return;
             }
         }
         show_error('Not allowed'); // function exits
     }

}

如果您重构您的数据库结构以在permission 表中包含您的控制器/方法,您就不必在每个身份验证方法中包含can_access,并且可以让您的控制器扩展MY_Controller 代码看起来像:

class MY_Controller extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->can_access();
    }

    private function can_access() {
        $controller = $this->router->class;
        $method = $this->router->method;
        $curr_user = $this->session->userdata('user_id');
        // do join between permissions and permissions role...
        // check if num_rows > 0 for current user given the controller/method
        // if num_rows is not greater than 0 (user doesn't have permission)
        // then show error. otherwise do nothing (user has permission)
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 2016-09-09
    相关资源
    最近更新 更多