RBAC权限控制【TP3.2实现】
2017-11-10 20:32
253 查看
1---引入
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有多个角色,每一个角色拥有多个权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。2---RBAC模型设计
3---实现方法
3-1方法一
1.通过登录获取用户ID,通过用户ID获取用户角色ID组 2.通过获取当前权限(控制器名/方法名)得到权限对应的ID,通过权限ID获取拥有该权限的角色ID组 3.通过函数array_intersect()获取第一步 和 第二步 的公共部分
3-2方法二
1.通过登录获取用户ID,通过用户ID获取用户角色ID组(用户角色表) 2.通过用户角色获取角色拥有的权限(角色权限表) 3.查询权限中是否拥有当前访问权限
4---RBAC源码
[此处使用方法一实现]<?php namespace Admin\Controller; use Think\Controller; class ComController extends Controller { // 检测非法登录 public function __construct() { parent::__construct(); if(!session('uid')){ $this->error('请登录',U('Login/login'),2); } // 调取检测权限方法 $comRole = $this->checkPower(); if($comRole == NULL){ $this->error('请向管理员申请权限'); } } // 检测权限 public function checkPower() { // 获取当前用户的ID $adminId = session('uid'); // 获取当前用户对应的角色 $roleIdList = M('AdminRole')->where(array('admin_id'=>$adminId))->getField('rid',true); // 获取当前 控制器 和 方法 【拼接】 $power = CONTROLLER_NAME.'/'.ACTION_NAME; //设置首页所有登录用户可访问 if($power == "Index/index"){ return 1; } // 查询当前(控制器/方法)对应的权限的ID $power_id = M('Power')->where(array('power_url'=>$power))->getField('power_id'); // 查询当前权限对应的所有角色 $roleId = M('RolePower')->where(array('pid'=>$power_id))->getField('rid',true); // 检测是否有公共项 $roles = array_intersect($roleIdList, $roleId); return $roles; } } ?>
[说明]
array_intersect ---- 计算数组的交集 array_ intersect ( array $array1 , array $array2 [, array $ ... ] )
5---RBAC总结
5-1表详情
shop_admin //用户表 shop_role //角色表 shop_power //权限表(控制器名/方法名) shop_admin_role //用户角色表 shop_role_power //角色权限表
5-2表设计
CREATE TABLE `shop_admin` ( `admin_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `admin_name` varchar(20) DEFAULT NULL, `admin_pwd` varchar(50) DEFAULT NULL, `last_time` int(20) DEFAULT NULL, `error_time` int(10) NOT NULL DEFAULT '0', PRIMARY KEY (`admin_id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; CREATE TABLE `shop_role` ( `role_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `role_name` varchar(20) NOT NULL, `role_status` int(10) NOT NULL DEFAULT '1' COMMENT '启用状态\r\n 启用 1(默认) \r\n停用 0\r\n\r\n', PRIMARY KEY (`role_id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; CREATE TABLE `shop_power` ( `power_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `power_name` varchar(255) DEFAULT NULL, `power_url` varchar(50) DEFAULT NULL, PRIMARY KEY (`power_id`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; CREATE TABLE `shop_admin_role` ( `a_r_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `aid` int(10) NOT NULL, `rid` int(10) NOT NULL, PRIMARY KEY (`a_r_id`) ) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8; CREATE TABLE `shop_role_power` ( `r_p_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `rid` int(10) DEFAULT NULL, `pid` int(10) DEFAULT NULL, PRIMARY KEY (`r_p_id`) ) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8;
RBAC总结完毕!!!
相关文章推荐
- Xianfeng轻量级Java中间件平台:基于RBAC模型实现权限控制的原理
- Xianfeng轻量级Java中间件平台:基于RBAC模型实现权限控制的原理
- Yii2搭建后台并实现rbac权限控制完整实例教程
- Angular中在前后端分离模式下实现权限控制 - 基于RBAC
- 基于AOP实现权限管理:访问控制模型RBAC和ACL
- yii2搭建完美后台并实现rbac权限控制案例--之左侧菜单子级无法高亮的问题
- SpringSecurity 3.2入门(9)自定义权限控制代码实现
- 如何设计数据库表实现完整的RBAC(基于角色权限控制)
- 使用Spring Security、Spring Data Jpa实现的RBAC权限控制
- Angular中在前后端分离模式下实现权限控制 - 基于RBAC【转】
- YII框架使用SRBAC实现RBAC权限访问控制
- 如何设计数据库表实现完整的RBAC(基于角色权限控制)
- 【转】sql 如何设计数据库表实现完整的RBAC(基于角色权限控制)
- AngularJS中在前后端分离模式下实现权限控制 - 基于RBAC
- yii2搭建完美后台并实现rbac权限控制案例教程
- yii2搭建完美后台并实现rbac权限控制案例教程
- 如何设计数据库表实现完整的RBAC(基于角色权限控制)
- 使用Spring Security、Spring Data Jpa实现的RBAC权限控制
- PHP RBAC权限控制实现思路
- yii2搭建完美后台并实现rbac权限控制