热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Yii2.0中文开发向导——RBAC(基于角色的访问控制权限)表结构原理分析

这里有几个概念很重要,我简单用大白话说一下;权限:就是指用户是否可以执行哪些操作。如:小张可以发帖、回帖、浏览,小红只能回帖、浏览角色:就是上面说的一组操作的集合。如:高级会员有发帖、回帖

这里有几个概念很重要,我简单用大白话说一下; 
权限: 
就是指用户是否可以执行哪些操作。 
如:小张可以发帖、回帖、浏览,小红只能回帖、浏览 
角色: 
就是上面说的一组操作的集合。 
如:高级会员有发帖、回帖、删贴、浏览的权限,普通会员只有回帖、浏览的权限。 
比如小张是高级会员,那么他就可以执行发帖、回帖、删贴、浏览。而小红是普通会员,所以它就只能回帖、浏览。 
另外角色还可以继承,中级会员除了普通会员的回帖、浏览功能外,还可以发帖。也就是说在普通会员的基础上又增加了一个发帖的权限。 
在Yii2.0中

  • yii\rbac: Item  为角色或者权限的基类,其中用字段type来标识
  • yii\rbac: Role  为代表角色的类
  • yii\rbac: Permission  为代表权限的类
  • yii\rbac: Assignment  为代表用户角色或者权限的类
  • yii\rbac: Rule  为代表角色或权限能否执行的判定规则表


存储角色或权限的表:auth_item 
由于它们的数据存储在一张表 [auth_item] 里面,所以他们有一个共同的基类yii\rbac:Item ,用 $type 字段来标识是角色还是权限。 
  
从上面可以看到,上面的三个是用户角色,下面的五个是权限。 
角色权限关联表:auth_item_child 
上面我们说过,角色是一组权限的集合,所以还有一个表 [auth_item_child] 用来保存角色和权限的关系。 
写几个测试数据会看的更明白,现在我们在表auth_item_child中指定它们的关系

   parent                    child
hight_user add
hight_user edit
hight_user delete
......
low_user reply
low_user view
..................
middle_user low_user
middle_user add


hight_user和low_user的关系我们容易理解,middle_user就不一样了,它指定了另外一个角色: low_user 和一个权限: add 。 
这个意思就是说 middle_user 包含了low_user的权限,另外又添加了一个add权限。 
除了角色可以包含角色外,权限也是可以包含权限的。也就是说这个表里面有三个关系:

  • 角色 包含 权限
  • 角色 包含 角色
  • 权限 包含 权限


如果要得到一个角色的所有的权限,要做两方面的查找,一个是递归查找当前权限所有的子权限, 一个是查看所包含的角色的所有的权限以及子权限。 
所以在使用中不建议让权限继承,只让角色继承。而且继承深度也不宜太深。 
最重要的也就是上面这两个表,具体的代码是怎么实现的会在后面源码分析里面说明。 
用户角色(权限)表:[auth_assignment] 
这个表用来存储用户的角色或者权限。 
为什么是 角色或者权限 ? 
如上面,给角色指定权限有两种办法

  • 一种是直接给角色指定相应的权限
  • 一种是让一个角色继承(我始终觉的 继承 这个词要好于 包含 )自另外一个角色,另外还可以再单独指定其它的权限。


所以对用户而言也有两种方法。

  • 一种是给用户指定相应的角色
  • 一种是给用户指定相应的权限。


  
这样一个用户的权限包含两部分,一部分是所指定的角色代表的权限,一部分就是直接所指定的权限。 
规则表:[auth_rule] 
一个用户要执行一个操作除了要看他有没有这个权限外,还要看他的这个权限能不能执行。 
在上面的 表:auth_item 中还有一个字段: [rule_name] 。这个字段用来标明这个角色或者权限能不能成功执行。 
那么规则这个表里面的数据是从哪里来的呢? 
下面这个是规则的基类:

abstract class Rule extends Object
{

/**
* @var string name of the rule
*/

public $name;
/**
* @var integer UNIX timestamp representing the rule creation time
*/

public $createdAt;
/**
* @var integer UNIX timestamp representing the rule updating time
*/

public $updatedAt;

/**
* Executes the rule.
*
* @param Item $item the auth item that this rule is associated with
* @param array $params parameters passed to [[ManagerInterface::allow()]].
* @return boolean a value indicating whether the rule permits the auth item it is associated with.
*/

abstract public function execute($item, $params);
}


$name 为规则的名称。 
也就是说如果要在 规则表:[auth_rule] 中增加一条规则就得要有对应的规则类,并实现方法 abstract public function execute($item, $params) 具体的逻辑来判定$item(角色或者权限)是否可执行。 


推荐阅读
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • yii2 绑定框架事件
    后端开发|php教程php,yii2后端开发-php教程我想要添加自定义代码处理yii2框架的Application::EVENT_BEFORE_REQUEST时触发的事件,但是不 ... [详细]
  • 本文讨论了在增加形参后两段代码的输出结果不一样的问题。第一段代码中,形参a和arguments[0]是同一个东西,所以最后输出结果一样。而在第二段代码中,增加了形参b并给其设置了默认值,导致arguments[0]不再是形参a,而是形参b的值,从而导致输出结果不同。作者对此提出了疑惑,并探讨了为什么形参b的默认值会影响到arguments[0]对形参a的跟踪的问题。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了一个关于正则的困惑,即为什么一个函数会获取parent下所有的节点。同时提出了问题是否是正则表达式写错了。 ... [详细]
  • 本文讨论了使用HTML5+JS开发App所需的框架和工具推荐,希望能提供真实案例作为参考。重点考虑框架和工具的文档齐全性以及是否支持二维码扫描、摇一摇等功能。同时提到了H5+框架的适用性。 ... [详细]
  • 以数据驱动品牌,为出海强势护航
                    原创
    原标题:以数 ... [详细]
author-avatar
张量扰动艹_712
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有