注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

zjcjack的博客

 
 
 

日志

 
 

详解Yii的RBAC权限体系  

2012-03-13 18:06:32|  分类: YII框架 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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,这就是角色的业务规则。
你可以这么写版主的规则

1
return in_array(Yii::app()->user->id, $params['board']->owner_ids);

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

1
return (Yii::app()->user->id==$params['post']->user_id);

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

在controller中这样判断:

1
2
3
4
5
$params=array('board'=>$board, 'post'=>$post);
if(Yii::app()->user->checkAccess('postManaging',$params))
{
    //管理这个帖子,上面的postManaging可以是task,也可以是operation
}

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public function filters()
{
return array(
'accessControl',
);
}
 
public function accessRules()
{
return array(
array('allow',
'actions'=>array('delete'),
'roles'=>array('admin'),
),
);
}

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

  评论这张
 
阅读(782)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018