ACL(访问控制列表)Codeigniter 按用户 ID 而不是按角色
Posted
技术标签:
【中文标题】ACL(访问控制列表)Codeigniter 按用户 ID 而不是按角色【英文标题】:ACL (Access Control List) Codeigniter by User ID not by Roles 【发布时间】: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)
的控制器名称和方法名称是什么吗?
【参考方案1】:
假设Branch
.etc。是控制器,view
、edit
是您的存储系统必须执行的方法:
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)
【讨论】:
以上是关于ACL(访问控制列表)Codeigniter 按用户 ID 而不是按角色的主要内容,如果未能解决你的问题,请参考以下文章