详解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,这就是角色的业务规则。
你可以这么写版主的规则
[coolcode lang=”php”]
return in_array(Yii::app()->user->id, $params[‘board’]->owner_ids);
[/coolcode]
然后这么写帖子创建者的规则:
[coolcode lang=”php”]
return (Yii::app()->user->id==$params[‘post’]->user_id);
[/coolcode]
这样就可以表示一个业务逻辑,判断它是否为真值,就可以得到是否属于这个角色。但这个$param参数是哪里来的捏?

在controller中这样判断:
[coolcode lang=”php”]
$params=array(‘board’=>$board, ‘post’=>$post);
if(Yii::app()->user->checkAccess(‘postManaging’,$params))
{
//管理这个帖子,上面的postManaging可以是task,也可以是operation
}
[/coolcode]

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

还有一种比较傻瓜的判断方法,如果一个operation名字是PostDelete这样的命名的话,那可以利用这样的语句配置一下,然后当访问 http://localhost/post/delete这个网址,就会自动进行权限验证。
[coolcode lang=”php”]
public function filters()
{
return array(
‘accessControl’,
);
}

public function accessRules()
{
return array(
array(‘allow’,
‘actions’=>array(‘delete’),
‘roles’=>array(‘admin’),
),
);
}
[/coolcode]
打完收功,特此记录。查srbac中有一列是data,这列拿来做什么用的有心情还可以再看看。



发表评论

您的电子邮箱地址不会被公开。

− 5 = 2