ThinkPHP的RBAC(基于角色权限控制)深入解析


Posted in PHP onJune 17, 2013

一、什么是RBAC
基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。
在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。
在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

二、ThinkPHP中的RBAC
先看下官方给的实例所用到的数据表,通过5张表实现权限控制,定义如下:
RBAC 要用到5个数据表
think_user (用户表)
think_role (用户分组表)
think_node (操作节点)
think_role_user (用户和用户分组的对应)
think_access (各个操作和用户组的对应)

ThinkPHP的RBAC(基于角色权限控制)深入解析
用户表

ThinkPHP的RBAC(基于角色权限控制)深入解析
角色表,有哪些角色,该角色与对应的userid用户相关联

ThinkPHP的RBAC(基于角色权限控制)深入解析
根据用户表的id给出对应的角色id相关联,也就是给用户分配角色,比如userid为3的角色为2,根据role角色表,7代表员工的角色

ThinkPHP的RBAC(基于角色权限控制)深入解析
access表,权限表,比如角色id为2,也就是员工的权限,可以的对应的结点

ThinkPHP的RBAC(基于角色权限控制)深入解析

结点表,代表有哪些应用-模块-模块方法,并且定义了之间的一种关系,比如noteid为30的是Public模块,noteid为31,32,33,34的方法add,insert,edit,update都属于Public。noteid为85的test方法,属于noteid为84的Game模块下的方法。

三、config配置文件详解
我们看看thinkphp官方示例中的config文件:

array(
        'APP_AUTOLOAD_PATH'=>'@.TagLib',
        'SESSION_AUTO_START'=>true,
        'USER_AUTH_ON'              =>true,
        'USER_AUTH_TYPE'            =>1,        // 默认认证类型 1 登录认证 2 实时认证
        'USER_AUTH_KEY'             =>'authId',    // 用户认证SESSION标记
        'ADMIN_AUTH_KEY'            =>'administrator',
        'USER_AUTH_MODEL'           =>'User',    // 默认验证数据表模型
        'AUTH_PWD_ENCODER'          =>'md5',    // 用户认证密码加密方式
        'USER_AUTH_GATEWAY'         =>'/Public/login',// 默认认证网关
        'NOT_AUTH_MODULE'           =>'Public',    // 默认无需认证模块
        'REQUIRE_AUTH_MODULE'       =>'',        // 默认需要认证模块
        'NOT_AUTH_ACTION'           =>'',        // 默认无需认证操作
        'REQUIRE_AUTH_ACTION'       =>'',        // 默认需要认证操作
        'GUEST_AUTH_ON'             =>false,    // 是否开启游客授权访问
        'GUEST_AUTH_ID'             =>0,        // 游客的用户ID
        'DB_LIKE_FIELDS'            =>'title|remark',
        'RBAC_ROLE_TABLE'           =>'think_role',
        'RBAC_USER_TABLE'           =>'think_role_user',
        'RBAC_ACCESS_TABLE'         =>'think_access',
        'RBAC_NODE_TABLE'           =>'think_node',
        'SHOW_PAGE_TRACE'=>1//显示调试信息
    );

大家看注释就应该懂大半了,其中Public模块是无需认证的,道理很简单,没登录之前大家都是游客身份,如果登录页面也要权限,那从哪里登录呢?是吧,呵呵。默认网关地址就是认证失败,没有权限跳转到此处,重新登陆。ADMIN_AUTH_KEY表示超级管理员权限,如果你在user表建立一个名为admin的用户,那么这个用户就是超级管理员,不用给它分配权限,什么权限都有,为什么要设置一个这样的管理员,因为当你把权限分配错了容易引起系统权限混乱,搞得大家都访问不了,这时候超级管理员就来了。

四、RBAC类的几个重要的方法
authenticate($map,$model=”)方法 传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息
saveAccessList($authId=null)方法 传入用户的ID 此方法不返回值,只是设置 $_SESSION['_ACCESS_LIST']的值,其中包含了所有该用户对应的用户组的有权限操作的所有节点 $_SESSION['_ACCESS_LIST']['项目名']['模块名']['操作名'],以后判断权限就是判断当前项目,模块和操作是否在 $_SESSION['_ACCESS_LIST']中能找到。
checkAccess() 方法 检测当前模块和操作是否需要验证 返回bool类型
checkLogin()方法 检测登录
AccessDecision($appName=APP_NAME) 方法 就是检测当前项目模块操作 是否在$_SESSION['_ACCESS_LIST']数组中,也就是说 在 $_SESSION['_ACCESS_LIST'] 数组中$_SESSION['_ACCESS_LIST']['当前操作']['当前模块']['当前操作']是否存在。如果存在表示有权限 否则返回flase。
getAccessList($authId) 方法 通过查询数据库 返回权限列表 $_SESSION['_ACCESS_LIST']的值了。

PHP 相关文章推荐
Fatal error: Call to undefined function curl_init()解决方法
Apr 09 PHP
PHP中的array数组类型分析说明
Jul 27 PHP
深入了解PHP类Class的概念
Jun 14 PHP
php 生成唯一id的几种解决方法
Mar 08 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
php生成EAN_13标准条形码实例
Nov 13 PHP
PHP中array_slice函数用法实例详解
Nov 25 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
PHP实现动态柱状图改进版
Mar 30 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
PHP基于GD库的图像处理方法小结
Sep 27 PHP
php实现的读取CSV文件函数示例
Feb 07 PHP
深入PHP curl参数的详解
Jun 17 #PHP
解析php curl_setopt 函数的相关应用及介绍
Jun 17 #PHP
PHP中array_merge和array相加的区别分析
Jun 17 #PHP
php之Memcache学习笔记
Jun 17 #PHP
解析ajax事件的调用顺序
Jun 17 #PHP
sql注入与转义的php函数代码
Jun 17 #PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 #PHP
You might like
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
解决phpcms更换javascript的幻灯片代码调用图片问题
2014/12/26 PHP
CodeIgniter控制器之业务逻辑实例分析
2016/01/20 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
一个XML格式数据转换为图表的例子
2010/02/09 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
jQuery实现仿淘宝带有指示条的图片转动切换效果完整实例
2015/03/04 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
用自定义图片代替原生checkbox实现全选,删除以及提交的方法
2016/10/18 Javascript
Javascript使用SWFUpload进行多文件上传
2016/11/16 Javascript
Vue.js实现移动端短信验证码功能
2017/03/29 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
微信小程序Flex布局用法深入浅出分析
2019/04/25 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
python实现html转ubb代码(html2ubb)
2014/07/03 Python
Python中如何获取类属性的列表
2016/12/26 Python
python脚本开机自启的实现方法
2019/06/28 Python
python dumps和loads区别详解
2020/02/04 Python
Python打包工具PyInstaller的安装与pycharm配置支持PyInstaller详细方法
2020/02/27 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
生产部主管岗位职责
2014/01/06 职场文书
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server