通过用户ID而不是角色的ACL(访问控制列表)代码生成器

时间:2018-12-10 08:16:24

标签: php mysql codeigniter acl

我尝试创建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    |                |
+------------------------+--------------+------+-----+---------+----------------+

然后,权限表与 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检查,但是我的数据库没有保存类控制器,则... 有什么办法吗?

谢谢,抱歉我的英语不好

1 个答案:

答案 0 :(得分:0)

假设Branch等。是控制器,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表中同时包含控制器/方法,则不必在每个auth方法中都包含can_access,而只需让控制器扩展{{ 1}},其代码如下:

MY_Controller