这里有几个概念很重要,我简单用大白话说一下;

权限:
就是指用户是否可以执行哪些操作。

如:小张可以发帖、回帖、浏览,小红只能回帖、浏览

角色:
就是上面说的一组操作的集合。

如:高级会员有发帖、回帖、删贴、浏览的权限,普通会员只有回帖、浏览的权限。
比如小张是高级会员,那么他就可以执行发帖、回帖、删贴、浏览。而小红是普通会员,所以它就只能回帖、浏览。

另外角色还可以继承,中级会员除了普通会员的回帖、浏览功能外,还可以发帖。也就是说在普通会员的基础上又增加了一个发帖的权限。

在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字段来标识是角色还是权限。
<ignore_js_op> 
从上面可以看到,上面的三个是用户角色,下面的五个是权限。

角色权限关联表: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]

这个表用来存储用户的角色或者权限。

为什么是角色或者权限?

如上面,给角色指定权限有两种办法

  • 一种是直接给角色指定相应的权限

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

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

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

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

<ignore_js_op> 
这样一个用户的权限包含两部分,一部分是所指定的角色代表的权限,一部分就是直接所指定的权限。

规则表:[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(角色或者权限)是否可执行。

主要的分析也就完成了。关于这一部分的源码分析,过几天也会出来的。
哪一部分没说清楚或者还有其它问题都可以留言讨论。谢谢各位。喜欢的就顶一下。

原文链接:http://www.yiifans.com/forum.php?mod=viewthread&tid=74#lastpost

Yii中 RBAC(基于角色的访问控制权限)表结构原理分析的更多相关文章

  1. RBAC(基于角色的访问控制权限)表结构

    Rbac 支持两种类,PhpManager(基于文件的) 和 DbManager(基于数据库的) 权限:就是指用户是否可以执行哪些操作 角色:就是上面说的一组操作的集合,角色还可以继承 在Yii2.0 ...

  2. YII RBAC基于角色的访问控制

    基于角色的访问控制( Role-Based Access Control ),是一种简单的而又强大的集中访问控制.基于Yii Framework 的 authManager 组件实现了分等级的 RBA ...

  3. RBAC基于角色的访问控制

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

  4. RBAC 基于角色的访问控制

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  5. RBAC: 基于角色的访问控制(Role-Based Access Control)

    本文只讨论两种基于角色的访问控制的不同点,不涉及权限设计的数据库设计. 基于角色的访问控制(Role-Based Access Control)可分为隐式角色访问控制和显式角色访问控制. 隐式角色访问 ...

  6. Yii简单的基于角色的访问控制

    public function filters() { return array( 'accessControl', // perform access control for CRUD operat ...

  7. php : RBAC 基于角色的用户权限控制-表参考

    --管理员表 CREATE TABLE `sw_manager` ( `mg_id` int(11) NOT NULL AUTO_INCREMENT, `mg_name` varchar(32) NO ...

  8. YIi 权限管理和基于角色的访问控制

    验证和授权(Authentication and Authorization) 定义身份类 (Defining Identity Class) 登录和注销(Login and Logout) 访问控制 ...

  9. 基于角色的访问控制 (RBAC)权限管理

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

随机推荐

  1. JQ属性和css部分测试

    1.attr(name|properties|key,value|fn)  设置或返回被选元素的属性值. <div class="attr">设置或返回被选元素的属性值 ...

  2. How to get blob data using javascript XmlHttpRequest by sync

    Tested: Firefox 33+ OK Chrome 38+ OK IE 6 -- IE 10 Failed Thanks to 阮一峰's blog: http://www.ruanyifen ...

  3. atmega32u4制作arduino leonardo最小系统

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 一.leonardo最小系统 关于leonardo这里不再介绍,直接上最小系统原理图,该系统 ...

  4. http 请求类

    1.httpclient请求类 代理demo:http://hc.apache.org/httpcomponents-client-4.3.x/httpclient/examples/org/apac ...

  5. NYOJ 741 &quot;数学家&quot;ST

    "数学家"ST 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 ST是个非常特别的人类,不仅喜欢做一些不同平常的事,并且对于在无聊的时候怎样打发时 ...

  6. 支付宝支付后回调通知中responseTxt=true isSign=False可能的问题

    在做支付宝的二维码扫码支付功能,生成二维码成功,扫描后也能付款,付款后也能回调通知到我的页面,但是验证签名的时候出错,找了好久终于找到是什么原因: 引用 1. 用的RSA签名验证,默认密钥纯字符,并不 ...

  7. 【规范】javascript 变量命名规则

    javascript 有三大经典的变量命名法:匈牙利命名法,驼峰式命名法和帕斯卡命名法.今天主要介绍下这三种命名方式. 匈牙利命名法 语法 变量名 = 类型 + 对象描述 类型指变量的类型 对象描述指 ...

  8. Mac OS X下Sublime Text (V2.0.1)破解

    转自:http://blog.sina.com.cn/s/blog_559d66460101cab0.html 1. 在http://www.sublimetext.com/上根据操作系统选择对应版本 ...

  9. Windows Live Writer配置步骤

    推荐文档: [超详细教程]使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结 Live Writer 使用小贴示:发博客时始终使用图片原始 ...

  10. 移植UE4的Spline与SplineMesh组件到Unity5

    一个月前,想开始看下UE4的源码,刚开始以为有Ogre1.9与Ogre2.1源码的基础 ,应该还容易理解,把源码下起后,发现我还是想的太简单了,UE4的代码量对比Ogre应该多了一个量级,毕竟Ogre ...