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总结完毕!!!