RBAC权限控制【TP3.2实现】

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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红尘炼炼心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值