首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Access >

YII学习其次十三天,accessRules用法

2013-11-08 
YII学习第二十三天,accessRules用法访问控制过滤器(Access?Control?Filter)访问控制过滤器是检查当前用户

YII学习第二十三天,accessRules用法

访问控制过滤器(Access?Control?Filter)
访问控制过滤器是检查当前用户是否能执行访问的controller?action的初步授权模式。

这种授权模式基于用户名客户IP地址访问类型

访问控制过滤器,适用于简单的验证

?

需要复杂的访问控制,需要使用将要讲解到的基于角色访问控制(role-based?access?(RBAC))。


在控制器(controller)里重载CController::filters方法,设置访问过滤器来控制访问动作(看?Filter?了解更多过滤器设置信息)。
class?PostController?extends?CController
{
......
public?function?filters()
????{
????????return?array(
????????????'accessControl',
????????);
????}
}
在上面,设置的access?control过滤器将应用于PostController里每个动作。

过滤器具体的授权规则通过重载控制器的CController::accessRules方法来指定。
class?PostController?extends?CController
{
????......
????public?function?accessRules()
????{
????????return?array(
????????????array('deny',
????????????????'actions'=>array('create',?'edit'),
????????????????'users'=>array('?'),
????????????),
????????????array('allow',
????????????????'actions'=>array('delete'),
????????????????'roles'=>array('admin'),
????????????),
????????????array('deny',
????????????????'actions'=>array('delete'),
????????????????'users'=>array('*'),
????????????),
????????);
????}
}
上面设定了三个规则,每个用个数组表示。

数组的第一个元素不是'allow'就是'deny',其他的是名-值成对形式设置规则参数的。

上面的规则这样理解:

create和edit动作不能被匿名执行;

delete动作可以被admin角色的用户执行;

delete动作不能被任何人执行。


访问规则是一个一个按照设定的顺序一个一个来执行判断的。

和当前判断模式(例如:用户名、角色、客户端IP、地址)相匹配的第一条规则决定授权的结果。

如果这个规则是allow,则动作可执行;

如果是deny,不能执行;如果没有规则匹配,动作可以执行。
?
为了确保某类动作在没允许情况下不被执行,设置一个匹配所有人的deny规则在最后,类似如下:
return?array(
????//?...?别的规则...
????//?以下匹配所有人规则拒绝'delete'动作
????array('deny',
????????'action'=>'delete',
????),
);
因为如果没有设置规则匹配动作,动作缺省会被执行。
访问规则通过如下的上下文参数设置:


actions:?设置哪个动作匹配此规则。


users:?设置哪个用户匹配此规则。

此当前用户的name?被用来匹配,三种设定字符在这里可以用:
*:?任何用户,包括匿名和验证通过的用户。
?:?匿名用户。
@:?验证通过的用户。


roles:?设定哪个角色匹配此规则

这里用到了将在后面描述的role-based?access?control技术。

In?particular,?the?rule?is?applied?if?CWebUser::checkAccess?returns?true?for?one?of?the?roles.提示,用户角色应该被设置成allow规则,因为角色代表能做某些事情。


ips:?设定哪个客户端IP匹配此规则。


verbs:?设定哪种请求类型(例如:GET,?POST)匹配此规则。


expression:?设定一个PHP表达式。

它的值用来表明这条规则是否适用。在表达式,你可以使用一个叫$user的变量,它代表的是Yii::app()->user。

?

?

?

?

?

?

访问规则中:
expression:?设定一个PHP表达式。它的值用来表明这条规则是否适用。在表达式,你可以使用一个叫$user的变量,它代表的是Yii::app()->user。
expression的具体用法:
class?AdminController?extends?CController
{
??……
????public?function?accessRules()
????{
????????return?array(
????????array('allow',??//允许所有人执行'login','error','index'
????????????????'actions'=>array('login','error','index'),
????????????????'users'=>array('*'),
????????),
????????array('allow',?//允许超级管理员执行所有动作
????????????????'actions'=>array('create','update','delete'),
????????????????'expression'=>array($this,'isSuperAdmin'),
????????),
????????array('allow',//允许普通管理员执行
????????????????'actions'=>array('update'),
????????????????'expression'=>array($this,'isNormalAdmin'),????//表示调用$this(即AdminController)中的isNormalAdmin方法。
????????),??????
????????array('deny',??//?deny?all?users
????????????????'users'=>array('*'),
????????),
????????);
????}

?

????//判断是否是超级管理员
????protected?function?isSuperAdmin($user)???//其中$user代表Yii::app()->user即登录用户。
????{
????????return?($this->loadModel($user->id)->adminAdminFlag==1);
????}

?

????//判断是否是普通管理员
????protected?function?isNormalAdmin($user)????//其中$user代表Yii::app()->user即登录用户。
????{
????????return?($this->loadModel($user->id)->adminAdminFlag==0);
????}

?

????public?function?loadModel($id)
????{
????????$model=Admin::model()->findByPk((int)$id);
????????if($model===null){
????????????throw?new?CHttpException(404,'页面不存在');?????
????????}
????????return?$model;
????}
}

?

?

注:其中$user代表Yii::app()->user即登录用户。

热点排行