ThinkPHP---RBAC

一、什么是RBAC

基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。

在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。

在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

二、ThinkPHP中的RBAC

先看下官方给的实例所用到的数据表,通过5张表实现权限控制,定义如下:

RBAC 要用到5个数据表

think_user (用户表)

think_role (用户分组表)

think_node (操作节点)

think_role_user (用户和用户分组的对应)

think_access (各个操作和用户组的对应)

用户表

角色表,有哪些角色,该角色与对应的userid用户相关联

根据用户表的id给出对应的角色id相关联,也就是给用户分配角色,比如userid为3的角色为2,根据role角色表,7代表员工的角色

access表,权限表,比如角色id为2,也就是员工的权限,可以的对应的结点

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


字段name就是当项目,模块或者操作的名称了。

字段PID 记录他们的从属关系,比如某一个模块是属于哪个项目,某个操作属于哪个模块。

字段level 表示该节点的层级 换句话就是说 level=1 为项目 ,level=2为模块 ,level=3就是操作了,比如说 admin项目,他的PID 就是 0 (项目的PID都是0) level就是1,nane就是admin了,admin项目下面有的user模块,它的level就应该是2,pid就是admin的id, admin下面user模块的add操作,level就该是3了,pid就应该是前面的user对应的ID.

三、config配置文件详解

我们看看thinkphp官方示例中的config文件:

 

 

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

四、RBAC类的几个重要的方法

authenticate($map,$model=”)方法 传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息

saveAccessList($authId=null)方法 传入用户的ID 此方法不返回值,只是设置 $_SESSION[‘_ACCESS_LIST’]的值,其中包含了所有该用户对应的用户组的有权限操作的所有节点 $_SESSION[‘_ACCESS_LIST’][‘项目名’][‘模块名’][‘操作名’],以后判断权限就是判断当前项目,模块和操作是否在 $_SESSION[‘_ACCESS_LIST’]中能找到。s

checkAccess() 方法 检测当前模块和操作是否需要验证 返回bool类型

checkLogin()方法 检测登录

AccessDecision($appName=APP_NAME) 方法 就是检测当前项目模块操作 是否在$_SESSION[‘_ACCESS_LIST’]数组中,也就是说 在 $_SESSION[‘_ACCESS_LIST’] 数组中$_SESSION[‘_ACCESS_LIST’][‘当前操作’][‘当前模块’][‘当前操作’]是否存在。如果存在表示有权限 否则返回flase。

getAccessList($authId) 方法 通过查询数据库 返回权限列表 $_SESSION[‘_ACCESS_LIST’]的值了。

转载于:https://www.cnblogs.com/freestyle-le/p/4518797.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c mysql bulk,MySqlBulkLoader批量上传遇到的问题和解决方法

最近用 MySqlBulkLoader 向MySql数据库批量上传数据遇到了些问题,做下记录问题1:如图原因:版本不合,使用的MySql版本和引用的mysql.data 版本不和解决方案:用nuget将mysql.data升级到对应版本,如果是MySql8…

Nim教程【七】

这是国内第一个关于Nim的系列教程 先说废话 很开心,在今天凌晨快一点多的时候拿到了 nim-lang.com;nim-lang.cn;nim-lang.net 这三个域名,到不是为了投资,准备用nim-lang.com做一个社区出来 不知道国内有没有人或者机构…

验证必须是数字php,Element 中表单非必填数据项 必须为数字的验证问题

Element-ui 的el-form组建中,自带基本的验证功能,比如某些项必填的验证,直接加入rules 规则中即可,如下实例:在页面中书写如下:在vue 初始化data中filterForm: {firstDay: ,lastDay: },rules: {firstDay: […

为开发者准备的9个实用PHP代码片段(转)

[导读] 当你开发网站、app或博客系统时,如果有一些实用的代码片段可以直接使用,就可以节省你大量的时间和精力。这篇文章就为你分享几个实用的PHP代码片段,帮助你的Web开发。 本文由PHP100中文网编译,转载请看文末的转载要求&…

idea 自动生产序列吗,IDEA自动生成序列化Id

实体对象实现了java.io.Serializable接口后,一般都会提供一个serialVersionUID以做版本区分。在idea里,可以通过设置来快速生成serialVersionUID。设置方法1、打开Preferences–>Editor–>Inspections,然后在右侧输入UID进行搜索(搜索方…

ZH奶酪:Ionic中(弹出式窗口)的$ionicModal使用方法

Ionic中[弹出式窗口]有两种(如下图所示),$ionicModal和$ionicPopup; $ionicModal是完整的页面; $ionicPopup是(Dialog)对话框样式的,直接用JavaScript设定对话框的一些参数,通常用于通知消息、确认等作用&a…

php getdefaultvalue,PHP ReflectionParameter getDefaultValueConstantName()用法及代码示例

ReflectionParameter::getDefaultValueConstantName()函数是PHP中的内置函数,如果默认值为常数或null,则用于返回默认值的常数名称。用法:string ReflectionParameter::getDefaultValueConstantName ( void )参数:该函数不接受任何参数。返回…

php表单中姓名必须使用汉字,我想在表单验证中加入中文姓名合法性模糊匹配判断?...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼刚开始只是想检验一下输入的是不是中文,后来学了正则表达式后,想尝试一下,把常见的姓氏通过字符串判断的形式,主要是对姓氏进行验证,当然还有输入长度,可我对自…

php实现购物车 redis,redis 哈希数据类型简单操作(实现购物车案例)

这里不累赘如何安装redis和php redis扩展,主要熟悉调用redis哈希数据类型如图简单方法操作如下1:hSet2:hGet4:hDel5:hGetAll4:hExists5:hIncrBy简单购物车实现namespaceHome\Controller;useThink\Controller;useOrg\Net\Http;useThink\Cache\Driver\Red…

写在25岁

虽然到25岁,大家会告诉你女人容颜开始衰退,要多加注意保养,要学会化妆,要会穿高跟鞋。虽然到25岁,大家告诉你要赶紧结婚生子,否则女人开始贬值。虽然到25岁,大家会告诉你工作不要那么拼&#xf…

matlab中D A1在哪,A1=d(1:15,:);A2=d(16:30,:);A3=

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼A1d(1:15,:);A2d(16:30,:);A3d(31:45,:);A4d(46:60,:);A5d(61:75,:);A6d(76:90,:);B1d(91:105,:);B2d(106:120,:);B3d(121:135,:);B4d(136:150,:);B5d(151:165,:);B6d(166:180,:);B7d(181:195,:);B8d(196:210,:);B9d(211:225,:);C1…

使用block的好处

1 使用block 可以轻松地绑定各处代码块,使用delete 结构是分散的,不利于变量之间传值,不像block可以随意地获取变量值。 2.使用block可以方便执行异步代码,作为异步处理回调。 In terms of code readability, the block makes it …

python mysql ssl,python – 在SQLAlchemy中使用SSL

我最近改变了我的项目使用SQLAlchemy并且我的项目运行正常,它使用了外部MySQL服务器.现在我正在尝试使用具有SSL CA的不同MySQL服务器,并且它不会连接.(它确实使用MySQL Workbench进行连接,因此证书应该没问题)我正在使用以下代码:ssl_args {ssl: {ca: ca_path}}en…

Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法

Easyui中使用jquery或js动态添加元素时出现的样式失效的解决方法 在添加完之后&#xff0c;可以使用 $.parser.parse();这个方法进行处理:(1) 对整个页面重新渲染: $.parser.parse();  (2) 渲染某个特定的组件:var targetObj $("<input namemydate classeasyui-date…

ftp完成版本更新php,php – 将开发团队从FTP转换为版本控制系统

问题&#xff1a;>你(他们)从来没有遇到过灾难,你(他们)需要恢复到以前版本的网站,但却不能因为他们破坏了它&#xff1f;>他们是否使用临时Web服务器来测试更改&#xff1f;>当然,如果没有某些测试,他们不会修改生产服务器中的代码&#xff1f;我怀疑第一个的答案是“…

IOS-NSDateFormatter使用介绍

IOS-NSDateFormatter使用介绍 NSDateFormatter的使用&#xff1a; NSDate *nowDate [[NSDate alloc] init];NSDateFormatter *dateFormatter [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:"yyyy-mm"];NSString *time [dateFormatter stringFromD…

php scsi平台,三大SCSI Target平台PK:让服务器化身SAN

就服务器而言&#xff0c;从虚拟化平台到数据库应用的许多功能&#xff0c;都需要有SAN存储设备的支持&#xff0c;但是对于模拟测试、教学之类的应用来说&#xff0c;受到成本限制采购SAN存储设备便有所困难。特别是企业&#xff0c;都不会仅仅为了测试等常态使用的用途&#…

[BZOJ 1012] [JSOI 2008] 最大数maxnumber

1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 5094 Solved: 2276[Submit][Status][Discuss]Description 现在请求你维护一个数列&#xff0c;要求提供以下两种操作&#xff1a; 1、 查询操作。语法&#xff1a;Q L 功能&#xff1a;查询当…

php 数组元素往后移动,php 二维数组 元素移动

[已关闭问题]关闭于 2014-11-20 16:02二维数组元素如何实现&#xff0c;满足一定的条件&#xff0c;跳到下下个元素&#xff0c;不满足的话&#xff0c;顺序执行呢&#xff1f;比如&#xff1a;header("Content-type:text/html;charsetutf-8");$arr array(array(id&…

RequireJS

RequireJS 2.0 正式发布 RequireJS入门&#xff08;一&#xff09; RequireJS入门&#xff08;二&#xff09; RequireJS入门&#xff08;三&#xff09; RequireJS进阶&#xff08;一&#xff09; RequireJS进阶&#xff08;二&#xff09; RequireJS进阶&#xff08;三&…