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用法的更多相关文章
- No_16_0324 Java基础学习第二十三天
文档版本号 开发工具 測试平台 project名字 日期 作者 备注 V1.0 2016.03.24 lutianfei none 登录注冊IO版 例如以下代码仅为UserDaoImpl类文件,其它原 ...
- Java学习第二十三天
1:多线程(理解) (1)多线程:一个应用程序有多条执行路径 进程:正在执行的应用程序 线程:进程的执行单元,执行路径 单线程:一个应用程序只有一条执行路径 多线程:一个应用程序有多条执行路径 多进程 ...
- Python学习第二十三课——Mysql 表记录的一些基本操作 (查)
查(select * from 表名) 基本语法: select <字段1,字段2,...> from <表名> where <表达式>; 例如,查询student ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十三章:角色动画 学习目标 熟悉蒙皮动画的术语: 学习网格层级变换 ...
- 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记
第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...
- javaSE第二十三天
第二十三天 338 1.进程和线程的概述 338 2.多线程(理解) 339 (1)多线程:一个应用程序有多条执行路径 339 (2)Java程序的运行原理及JVM的启动是多线 ...
- (转)JavaWeb学习总结(十三)——使用Session防止表单重复提交
如何防止表单重复提交 在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复 ...
- Gradle 1.12用户指南翻译——第二十三章. Java 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- “全栈2019”Java多线程第二十三章:活锁(Livelock)详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
随机推荐
- 关于ECSHOP模板架设的服务器php版本过高报错的解决方法(二)
ECShop安装之后,在后台发现一个错误,这个错误提示的意思:mktime()方法不带参数被调用时,会被抛出一个报错提示. ECShop安装之后,在后台发现一个错误提示: Strict Standar ...
- 如何使用jQuery动态的在body里添加script标签?
var script = document.createElement('script'); script.type = 'text/jacascript'; script.src = 'url'; ...
- JS 常用功能收集
JS 常用效果收集 1. 回到顶部>> 爱词霸
- 启用div作为编辑器 添加contentEditalbe属性
1.自从HTML5中新引入了contentEditalbe属性以后,div就与textarea一样,可以作为最常用的编辑器使用. 1.启用div作为编辑器 让div进入编辑状态很简单,只需要: 复制代 ...
- 最近一段OI学习计划
1.在寒假的时间里尽量吧图论和DP的基础先学一下: 图论:数,二叉树,DFS.BFS遍历,然后最短路径(Floyd.dijkstra.SPFA),然后再最小生成树吧,如果还有时间的话(kruskal( ...
- MariaDB数据解压版安装(10.0.16)
官网下载地址:https://downloads.mariadb.org/ (自己选择版本下载) 在windows 7 下安装 1.下载到解压版安装文件mariadb-10.0.16-win32 ...
- MQTT协议之 Apache Apollo服务
一.说明 MQTT是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网) ...
- Python学习笔记——基础篇【第六周】——shutil模块
常用模块之shutil 高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中,可以部分内容 def c ...
- nginx(1)
下一篇:nginx(2) 一.engin X 市场的服务器非常的多,这里简单介绍几种常用的. Apache:源代码开放,跨平台,可移植,且支持的模块非常丰富,虽然在速度性能上不如其他轻量级的web服务 ...
- suricata抓包方式之一AF_PACKET
suricata抓包方式之一AF_PACKET 噜拯渡 睦坚削 曜纡宄 式犒藿氆 咬焚桤φ 要蒯钮 喃俚夼 币噎嶂颐 话千叶舞就后悔了怎么想都容易让人引 虻谮м 及葚雏钏 看着表面平静实际 ...