in 技术与思考

详解Yii的RBAC权限体系

Yii还是不错的,提供了一个很不错的RBAC框架给咱们。不过之前没玩过,把玩了一下,搞定。

第一步,安装yii……
第二步,安装srbac这个扩展,这个扩展用起来是相当地销魂啊。

OK,现在我们开始解释。

RBAC即为role-based access control,它要解决的问题就是“谁能做什么”,分析此句,两大因素,人物(谁),动作(做什么)。

人物,在RBAC里分为两层,一层叫user,一层叫role。
张三是user,他可能同时拥有多个role,比如“注册用户”,“版主”,“帖子创建者”等。
user好解释,表中的某行就意味着一个user。
但角色,是由一个业务规则,或是说一个逻辑来指定的。比如“注册用户”的逻辑是“!Yii::app()->user->isGuest”,“版主”的逻辑是“in_array(Yii::app()->user->id, $board->owner_ids)”,“帖子创建者”的逻辑就是“Yii::app()->user->id == $post->user_id”。
如果这个逻辑判断为真,那么当前用户就属于这个角色。

动作,这也分两层。一层叫operation,一层叫task。
operation,是指一个原子操作。
而一个task可能包括了多个operation。
举个例子来说,“管理帖子”这个task就包括了“创建帖子”、“删除帖子”,“修改帖子”、“查看帖子”、“帖子列表”这四个operation。而“查看帖子”可能只包括了“查看帖子”、“帖子列表”这两个operation。

现在我们把用户和动作结合起来。
“版主”可以“管理帖子”,“来宾用户”可以“查看帖子”。got?

理清了基本概念,我们回到神奇的srbac。它提供了一个GUI界面来控制rbac权限表。
看到role/task/operation了没?大善。
role中你可以看到有一个字段叫Bizrule,这就是角色的业务规则。
你可以这么写版主的规则

然后这么写帖子创建者的规则:

这样就可以表示一个业务逻辑,判断它是否为真值,就可以得到是否属于这个角色。但这个$param参数是哪里来的捏?

在controller中这样判断:

如果当前用户是版主,或是当前用户是这个帖子的创建者,那么这个用户都可以进入管理区。

还有一种比较傻瓜的判断方法,如果一个operation名字是PostDelete这样的命名的话,那可以利用这样的语句配置一下,然后当访问http://localhost/post/delete这个网址,就会自动进行权限验证。

打完收功,特此记录。查srbac中有一列是data,这列拿来做什么用的有心情还可以再看看。

您还可能喜欢:

Write a Comment

Comment

11 Comments

  1. 搞了半天才弄明白要srbac扩展才能使用,我是说看了半天文档没搞明白那几个类怎么使用的。yii提供了几个权限方案?


  2. wicketmax:

    搞了半天才弄明白要srbac扩展才能使用,我是说看了半天文档没搞明白那几个类怎么使用的。yii提供了几个权限方案?

    srbac是帮助管理角色和规则的。Yii的官方文档在“设置权限”这方面没有提供界面,只提供了相关的类和接口。Yii本身就提供了这种RBAC的权限机制。当然你可以写个更符合你的要求的权限系统来。


  3. xieguolun:

    如何与工作流相结合呢?

    新年好:)

    RBAC概念不是YII特有的。它只提供了一种基于角色的权限控制的方案。
    当然权限控制的规则完全可以由你自己来定义。

    工作流系统中角色与权限的应用也可以参考这个体系来建立。不知道你想怎么在工作流中应用权限控制的,所以也不好给出我的建议:)

  4. 你好,请问你博客的主题叫什么,很喜欢这个主题,也在别处看到过,就是不知道哪下