您的位置:首页 > 编程语言 > PHP开发

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






内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: