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 相关文章推荐
php 购物车的例子
May 04 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
php截取后台登陆密码的代码
May 05 PHP
用PHP+MySQL搭建聊天室功能实例代码
Aug 20 PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 PHP
php表单提交与$_POST实例分析
Jan 26 PHP
简要剖析PHP的Yii框架的组件化机制的基本知识
Mar 17 PHP
修改Laravel5.3中的路由文件与路径
Aug 10 PHP
laravel5.2实现区分前后台用户登录的方法
Jan 11 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
Apr 27 PHP
PHP实现通过strace定位故障原因的方法
Apr 29 PHP
Ajax请求PHP后台接口返回信息的实例代码
Aug 21 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
Zerg剧情介绍
2020/03/14 星际争霸
php session劫持和防范的方法
2013/11/12 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
jquery仿京东导航/仿淘宝商城左侧分类导航下拉菜单效果
2013/04/24 Javascript
Jquery右下角抖动、浮动 实例代码(兼容ie6、FF)
2013/08/15 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
JavaScript中的this机制
2016/01/30 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
jQuery EasyUI Accordion可伸缩面板组件使用详解
2017/02/28 Javascript
vue.js的安装方法
2017/05/12 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
js正则取值的结果数组调试方法
2018/10/10 Javascript
微信小程序人脸识别功能代码实例
2019/05/07 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
python自动发邮件总结及实例说明【推荐】
2019/05/31 Python
基于python实现把图片转换成素描
2019/11/13 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
美国成衣女装品牌:CHICO’S
2016/09/19 全球购物
荷兰皇家航空公司官方网站:KLM Royal Dutch Airlines
2017/12/07 全球购物
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
摄影助理岗位职责
2014/02/07 职场文书
教师对学生的寄语
2014/04/03 职场文书
飞机制造技术专业求职信
2014/07/27 职场文书
应急管理工作总结2015
2015/05/04 职场文书
教师病假条范文
2015/08/17 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
Java Spring 控制反转(IOC)容器详解
2021/10/05 Java/Android
winserver2019安装软件一直卡在应用程序正在为首次使用做准备
2022/06/10 Servers