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即登录用户。

时间: 2024-10-09 02:57:59

yii accessRules用法的相关文章

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

访问控制过滤器(Access Control Filter)访问控制过滤器是检查当前用户是否能执行访问的controller action的初步授权模式. 这种授权模式基于用户名,客户IP地址和访问类型. 访问控制过滤器,适用于简单的验证. 需要复杂的访问控制,需要使用将要讲解到的基于角色访问控制(role-based access (RBAC)). 在控制器(controller)里重载CController::filters方法,设置访问过滤器来控制访问动作(看 Filter 了解更多过滤器

php-yii-form标签

yii 标签用法(模板) (2013-08-14 17:28:19) 转载▼ 标签: it 分类: yii yii模板中的label标签 <?php echo $form->labelEx($model,'name'); ?> 编译后: <label for="Project_name" class="required">项目名称 <span class="required">*</span>

YII框架中save()和insert()的用法差异

要了解YII框架中save()和insert()的用法差异,首先查看一下手册中关于两个方法的定义: http://www.yiichina.com/api/CActiveRecord#save-detail save() 方法 源码: framework/db/ar/CActiveRecord.php#784 保存当前的记录. 插入记录到数据表的一行, 如果它的isNewRecord属性为true(通常情况下使用的‘new’运算符来创建记录). 否则, 将被用于更新表中的相应行(通常情况下,使用

Yii框架里的一些zii用法

Yii中有很方便的日期控件CJuiDatePicker,其类在目录'zii.widgets.jui.CJuiDatePicker'下. 用法非常简单,只需要的渲染的页面加入一下php代码就可以. <?php  $this->widget('zii.widgets.jui.CJuiDatePicker', array( 'model'=>$project_model, 'attribute'=>'sign_time', 'language'=>'zh_cn', 'options

Yii -format 数据格式化类的用法

转自http://blog.csdn.net/dreamzml/article/details/8718887 // 格式化邮件,输出 <a href="mailto:....."></a>      echo Yii::app()->format->formatEmail('[email protected]');            // 格式化日期      Yii::app()->format->dateFormat ='Y-m

Yii 1.1 findByAttributes 占位符用法

$hModel = new User(); //用户model $i_lesson_id = 12; $hModel->findByAttributes(array(), 'i_user_id=:i_user_id and i_lesson_id=:i_lesson_id', array(':i_user_id'=>Yii::app()->user->getId(), ':i_lesson_id'=>$i_lesson_id)); //查询条件: i_user_id=xxx

Yii框架中的SQL用法

Yii框架的SQL User::find()->all(); //返回所有用户数据: User::findOne($id); //返回 主键 id=1 的一条数据: User::find()->where(['name' => 'ttt'])->one(); //返回 ['name' => 'ttt'] 的一条数据: User::find()->where(['name' => 'ttt'])->all(); //返回 ['name' => 'ttt'

YII使用技巧收集

db组件 'schemaCachingDuration'=>3600, 为什么不起做用?需要开缓存 如何在页面下边显示sql的查询时间在log组件的routes中加入array('class'=>'CProfileLogRoute','levels'=>'error, warning',)同时在db组件中加入'enableProfiling'=>true,同时在这种情况下,可以用CDbConnection::getStats() 查看执行了多少个语句,用了多少时间 如何知道某一个程

【Yii系列】处理请求

缘起 这一章是Yii系列的第三章,前两章给大伙讲解了Yii2.0的安装与Yii2.0的基本框架及基础概念,传送门: [Yii2.0的安装与调试]:http://www.cnblogs.com/riverdubu/p/6439680.html [Yii2.0基础框架]:http://www.cnblogs.com/riverdubu/p/6607373.html 相信学习过上两章的内容,你们是不是对Yii有个大致的了解了呢,Yii2.0基础框架这一章很重要,不仅仅是因为它的长度,而是里面讲解了整个