请选择 进入手机版 | 继续访问电脑版

Yii2|Yii爱好者中文社区门户

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: yii 控制器 数组
查看: 17233|回复: 19

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

  [复制链接]

175

主题

861

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
46481
发表于 2014-5-26 18:01:20 | 显示全部楼层 |阅读模式
原文链接:http://www.yiifans.com/forum.php?mod=viewthread&tid=74#lastpost

使用请见:YiiForm

Git地址:
https://github.com/yiifans/yiiforum
----------------------------------------------------------------------------------

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

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

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

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

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

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


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


存储角色或权限的表:auth_item

这个表用来存储角色和权限的数据,Role类和Permission类有一个共同的基类yii\rbac:Item,用$type字段来标识是角色还是权限。

从上图中可以看到,上面的三个是用户角色,下面的五个是权限。


角色权限关联表:auth_item_child

上面我们说过,角色是一组权限的集合,所以还有一个表[auth_item_child]用来保存角色和权限的关系。

写几个测试数据会看的更明白,现在我们在表auth_item_child中指定它们的关系
  1.    parent                    child
  2. hight_user                  add
  3. hight_user                  edit
  4. hight_user                  delete
  5. ......
  6. low_user                     reply
  7. low_user                     view
  8. ..................
  9. middle_user                low_user
  10. 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]。这个字段用来标明这个角色或者权限能不能成功执行。

那么规则这个表里面的数据是从哪里来的呢?
下面这个是规则的基类:
  1. abstract class Rule extends Object
  2. {
  3.     /**
  4.      * @var string name of the rule
  5.      */
  6.     public $name;
  7.     /**
  8.      * @var integer UNIX timestamp representing the rule creation time
  9.      */
  10.     public $createdAt;
  11.     /**
  12.      * @var integer UNIX timestamp representing the rule updating time
  13.      */
  14.     public $updatedAt;

  15.     /**
  16.      * Executes the rule.
  17.      *
  18.      * @param Item $item the auth item that this rule is associated with
  19.      * @param array $params parameters passed to [[ManagerInterface::allow()]].
  20.      * @return boolean a value indicating whether the rule permits the auth item it is associated with.
  21.      */
  22.     abstract public function execute($item, $params);
  23. }
复制代码

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

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


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


Yii2.0中文开发向导——目录

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

175

主题

861

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
46481
 楼主| 发表于 2014-6-27 16:26:27 | 显示全部楼层
我已经在yiiforum的例子中实现了 权限管理的功能
你可以看看那个
地址  http://github.com/yiifans/yiiforum

点评

太感谢了,一直不知怎么去写RBAC呢  发表于 2015-3-21 12:13
回复 支持 1 反对 0

使用道具 举报

175

主题

861

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
46481
 楼主| 发表于 2014-9-1 17:43:39 | 显示全部楼层
这段时间有点忙,有段时间没有 写了
回复 支持 0 反对 1

使用道具 举报

0

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2014-5-29 18:08:29 | 显示全部楼层
自带的这个rbac好用吗
回复 支持 反对

使用道具 举报

1

主题

4

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2014-6-9 17:21:40 | 显示全部楼层
顶一下
回复

使用道具 举报

1

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2014-6-10 11:20:54 | 显示全部楼层
支持一下 谢谢楼主分享
回复 支持 反对

使用道具 举报

1

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2014-6-10 11:21:15 | 显示全部楼层
支持一下 谢谢楼主分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2014-6-20 16:49:33 | 显示全部楼层
有例子吗楼主
回复 支持 反对

使用道具 举报

0

主题

2

帖子

36

积分

新手上路

Rank: 1

积分
36
发表于 2014-6-26 21:48:31 | 显示全部楼层
现在在做权限管理这块   无从下手  找不到资料    坐等楼主更新   
回复 支持 反对

使用道具 举报

2

主题

14

帖子

218

积分

中级会员

Rank: 3Rank: 3

积分
218
发表于 2014-9-1 17:02:08 | 显示全部楼层
楼主 说好的源码分析呢
回复 支持 反对

使用道具 举报

175

主题

861

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
46481
 楼主| 发表于 2014-9-1 17:43:09 | 显示全部楼层
还需要的话就再写几个
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|Yii2|Yii爱好者中文社区门户  

GMT+8, 2017-6-23 09:33 , Processed in 0.285223 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表