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-11-12 15:39:20

YII学习第二十三天,accessRules用法的相关文章

穿上华丽的外衣——CSS之旅(码神学习第二十三天)

穿上华丽的外衣--CSS之旅 码神学习第二十三天 学习过程记录: 1.CSS(Cascading Style Sheets,层叠样式表),为了解决内容与表现分离.样式通常存储在样式表中.外部样式表可以提高工作效率. 2.三种不同类型的CSS样式: 答:①内联样式:直接在html标签上定义该标签的CSS样式 ②内部样式:写在html文件中,且包含在<style></style>代码块中 ③外部样式:通过在html中引用外部css文件来控制样式 元素的优先级,就近原则,离元素最近的规则

Python 学习第二十三天 django 知识(五)

一,django 的model操作 1,字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 primary_key=True 注:当model中如果没有自增列,则自动会创建一个列名为id的列 from django.db import models class UserInfo(models.Model): # 自动创建一个列名为id的且为自增的整数列 us

No_16_0324 Java基础学习第二十三天

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.03.24 lutianfei none 登录注册IO版 如下代码仅为UserDaoImpl类文件,其他原码参考day22_login_regist工程 public class UserDaoImpl implements UserDao { // 为了保证文件一加载就创建 private static File file = new File("user.txt"); static { try { fil

JAVA学习第二十三课(多线程(二))- (多线程的创建方式二 :实现Runnable接口(常用))

当一个类有父亲,但是其中的功能还希望实现线程,那么就不能采用继承Thread的方式创建线程 那么就可以通过接口的方式完成 准备扩展Demo类的功能,让其中的内容可以作为线程的任务执行 实现Runnable接口,Runnable接口中只有一个方法run 一.创建线程的第二种方法 Runnable的出现仅仅是将线程的任务进行了对象的封装 /* * 创建线程的第二种方法 * 1.定义类实现Runnable接口 * 2.覆盖接口中的fun方法,将线程的任务代码封装到run方法中 * 3.通过Thread

Java进阶学习第二十三天——国际化与AJAX、JSON

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.06.10 lutianfei none 国际化 软件的国际化:软件开发时,要使它能同时应对世界不同地区和国家的访问,并针对不同地区和国家的访问,提供相应的.符合来访者阅读习惯的页面或数据. 国际化又称为 i18n:internationalization 软件实现国际化,需具备哪些特征: 对于程序中固定使用的文本元素,例如菜单栏.导航条等中使用的文本元素.或错误提示信息,状态信息等,需要根据来访者的地区和国家,选择不

linux基础学习第二十三天linux安全和加密之SSL\TLS协议、CA、openssl

内容: 1.通信加密类型及算法 2.TLS/SSL协议的引入及其通信过程 3.CA.数字签名的引入 4.一个安全的数据通信交换过程 5.openssl工具的使用 6.自制私有根CA过程 一.通信加密类型及算法 数据加密通信的重要性不言而喻,美国NIST,为了保证计算机的安全,提出了几个要求: (1).数据要有保密性:数据保密性和隐私性:确保信息不被别人获取,个人存储的信息不能被别人收集到: (2).完整性:包括数据完整性和系统完整性:数据完整性确保数据和程序只能以特定权限的进行授权和改变,只能授

Matlab学习第二天 插值的用法

插值的所有手段: 2.插值的示例源码: %interp1_example.m %用不同插值方法对一维数据进行插值,并比较其不同 x = 0:1.2:10; y = sin(x); xi = 0:0.1:10;  yi_nearest = interp1(x,y,xi,'nearset'); %最邻近插值 yi_linear = interp1(x,y,xi);            %默认插值方法是线性插值 yi_spline = interp1(x,y,xi,'spline ');  %三次样

linux基础学习第二十三天之openssh、sudo

内容: 1.openssh的介绍和使用 (1)sshd的服务端配置 (2)基于密钥登陆ssh的使用 (3)scp的使用 (4)rsync的使用 2.sudo的介绍和配置使用 一.openssh OpenSSH与SSH协议是远程登录的首选连接工具.它加密所有流量,以消除窃听,连接劫持和其它攻击. OpenSSH的套件包括以下工具: 远程操作使用 SSH, SCP,和 SFTP. 密钥管理 ssh-add, ssh-keysign, ssh-keyscan和ssh-keygen 服务端组成 sshd

数据结构学习第二十三天

13:50:24 2019-09-14 继续把未看完的看完 排序算法 定理:任意$N$个不同元素组成的序列平均具有$N(N-1)/4$个逆序对 定理:任何仅以交换相邻两元素来排序的算法,其平均时间复杂度为$Ω(N^2)$ 这样子 冒泡排序 插入排序 的最坏情况都是 N^2 要使排序算法变高效 得使用间隔元素来交换 在一次排序中 交换多个逆序对的元素 希尔排序 定义增量序列$D_M>D_{M-1}>...>D_1=1$ $对每个D_k进行“D_k-间隔”排序(k=M,M-1,...1)$