YII 权限管理,accessRules的用法
public function filters()
{
    return array(
        'accessControl', // perform access control for CRUD operations
    );
}
public function accessRules()
{
    return array(
        array(
            'allow', // allow all users to perform 'index' and 'view' actions
            'actions'=>array('index','view'),
            'expression'=>'CFunc::checkRight(MANAGER_VIEW)',
        ),
        array(
            'allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','write'),
            'users'=>array('admin'),
        ),
        array(
            'allow',
            'actions'=>array('delete'),
            'roles'=>array('admin'),
        ),
        array(
            'deny', // deny all users
            'users'=>array('*'),
        ),
    );
}

YII的访问控制过滤器(Access Control Filter)通过accessRules的参数进行授权控制。

访问规则通过如下的上下文参数设置:

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。

请结合上方的代码段加深理解,其中需要注意的有:

(1)顺序是从上而下,匹配成功即结束。访问规则是一个一个按照设定的顺序一个一个来执行判断的。和当前判断模式(例如:用户名、角色、客户端IP、地址)相匹配的第一条规则决定授权的结果。如果这个规则是allow,则动作可执行;如果是deny,不能执行;

(2)如果没有规则匹配,动作可以执行。所以一般在最后加上任何人deny的项,使没匹配到的在最后能匹配并禁止访问。

(3)expression是个自定义验证方法很有用的,它可以是一个字符串代码段,返回true或false。它也可以是个数组,指定调用某方法。

如:'expression'=>array($this,'isSuperAdmin'),表示调用$this的isSuperAdmin()来取得true or false

若您觉得我的博文对您有帮助,欢迎点击下方按钮对我打赏
打赏