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即登录用户。
yii accessRules用法的更多相关文章
- YII学习第二十三天,accessRules用法
访问控制过滤器(Access Control Filter)访问控制过滤器是检查当前用户是否能执行访问的controller action的初步授权模式. 这种授权模式基于用户名,客户IP地址和访问类 ...
- yii 标签用法(模板)
yii模板中的label标签 <?php echo $form->labelEx($model,'name'); ?> 编译后: <label for="Projec ...
- Yii系列总结:yii 标签用法
yii 常用标签:label标签.文本标签.error标签.textarea标签.hidden标签.password标签.url标签.radio标签.file标签.button标签.checkBox标 ...
- Yii ActiveRecord用法记录备忘
ActiveRecord 使用方法 Example1 in查询 $criteria = new CDbCriteria(); $criteria->select = $select; $crit ...
- php-yii-form标签
yii 标签用法(模板) (2013-08-14 17:28:19) 转载▼ 标签: it 分类: yii yii模板中的label标签 <?php echo $form->labelEx ...
- Yii CDbCriteria常用用法
$criteria = new CDbCriteria;$criteria->compare('name',$this->name,true,'OR'); //like部分匹配//$cri ...
- yii的criteria的用法
Yii的Active Recorder包装了很多. 特别是把SQL中 把where,order,limit,IN/not IN,like等常用短句都包含进CDbCriteria这个类中去,这样整个代码 ...
- yii widget使用的3个用法
yii视图中使用的widget方式总结:常用的有3种方式:一.显示详细信息: $this->widget('zii.widgets.CDetailView', array( 'data' =&g ...
- Yii中的CCheckBoxColumn在widget中的用法
'columns'=>array( array( 'class'=>'CCheckBoxColumn', 'id'=>'us ...
随机推荐
- Spring Quartz
Spring Quartz Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在Spring中怎样配置Quartz: 首先我们来写一个被调度的类: pac ...
- ubuntu ulimit 设置
永久设置ubuntu ulimit 之前是ulimit -n 65535那样设置,不过貌似只是当前环境有效果,重启服务器的话,又失效了...今天无意找到一个设置的方法,可以永久设置ulimit的参数. ...
- php翻页
<?php$conn = mysql_connect("localhost","root","") or die("连接数据 ...
- Backbone的一点使用心得
Backbone的其实感觉上上手很难,大概在一年前就想实践下,结果总是没有付诸行动,这次需求中狠狠心决定一定要使用一次看看,感受下. 可是第一步真的比较困难,因为直接看API好像没有感觉就在网上找实例 ...
- ssi项目(1)环境搭建
1.环境准备 导包(jdk1.8只支持spring4.0以上的版本) mysql驱动包 c3p0驱动包 mybatis包 spring-core.spring-aop.spring-web.sprin ...
- 配置DelegatingFilterProxy使用Spring管理filter chain
项目环境:JDK7 + Maven3.04 0. 项目使用springmvc作为controller层 1. 引入spring-security <dependency> <grou ...
- $scope 的生命周期
当Angular关心的事件发生在浏览器中时,比如用户在通过ng-model属性监控的输入字段中输入,或者带有ng-click属性的按钮被点击时,Angular的事件循环都会启动.这个事件将在Angul ...
- Oracle查询数据库中的所有表
SELECT A.TABLE_NAME 表英文名, A.TAB_COMMENTS 表中文名, A.COLUMN_ID 序号, A.COLUMN_NAME 英文名, ...
- STM32——assert_param(expr)
在STM32的固件库和提供的例程中,到处都可以见到assert_param()的使用.如果打开任何一个例程中的stm32f10x_conf.h文件,就可以看到实际上assert_param是一个宏定义 ...
- IOS的Crash情况在Crashlytics平台上统计解决方案的一点遗憾(截止到2015年6月14日)
平台针对特定版本的monkey操作后数量统计,按时间段定时去获取,最后根据操作批次出具分析报告: 问题是crashlytics平台仅提供一个BS登录查看WEB后台,所以无法通过API或者DB去直接获取 ...