Yii2框架ACF(AccessControl Filter)的使用
AccessControl其实也就是 yii\filters\AccessControl Filter, 我们下面简写为 ACF 作为描述。
ACF,访问控制过滤器,适用于简单的验证,面对的对象便是控制器的action。对于一些复杂的验证方式,我们后面会说到 Role Based Access Control (rbac),即基于角色的权限控制。
接下来我们就上面抛出的问题进行解析。
有同学要质疑了,创建新用户的操作,肯定要后台管理才可以进行操作,包括列表页等一系列操作,没登录肯定不能访问啊啊啊。
不急,下面我们就看看如何通过ACF去对 user-backend/* 的系列操作进行授权限制!
打开backend\controller\SiteController.php 我们看到这样一段代码
public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['login', 'error'],
                    'allow' => true,
                ],
                [
                    'actions' => ['logout', 'index'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
            ],
        ],
    ];
}
我们发现AccessControl是以行为behaviors的方式附加在当前控制器。
不妨打开yii\filters\AccessControl.php文件,init方法中我们看到 配置项rules在使用之前,都会被创建为 yii\filters\AccessRule 的对象。
也就是说我们实际的配置应该是这样的
'rules' => [
    [
        'class' => 'yii\filters\AccessRule',
        'actions' => ['login', 'error'],
        'allow' => true,
    ],
],
通过配置一文,很容易就猜到 这里的actions和allow就是 AccessRule的属性了。
接着我们看到实际的请求过滤是在beforeAction中进行的!也就是说,在beforeAction中加了一层过滤的条件规则!
如此一来,整个过滤的流程你是不是感觉到清晰了好多,但是还没有完,我们还没有说具体的过滤规则,从init方法中,我们了解到具体的规则即是 yii\filters\AccessRule 类的属性了。也就是说,规则怎么写,就要看你怎么设定accessRule的属性了!属性怎么设置?打开 yii\filters\AccessRule文件,看每一个具体的注解!这里就不说了,因为注解已经写得非常详细了,说多了自然就累赘,不好不好。
那接下来我们就解决问题,UserBackendController/* 所有的操作应该都设置为登录之后才可以操作
'access' => [
    'class' => AccessControl::className(),
    'rules' => [
        [
            // 当前rule将会针对这里设置的actions起作用,如果actions不设置,默认就是当前控制器的所有操作
            'actions' => ['index', 'view', 'create', 'update', 'delete', 'signup'],
            // 设置actions的操作是允许访问还是拒绝访问
            'allow' => true,
            // @ 当前规则针对认证过的用户; ? 所有方可均可访问
            'roles' => ['@'],
        ],
    ],
],
我们再做几个小练习
1、假设index操作只允许post请求才可以访问
'access' => [
    'class' => AccessControl::className(),
    'rules' => [
        [
            // 当前rule将会针对这里设置的actions起作用,如果actions不设置,默认就是当前控制器的所有操作
            'actions' => ['view', 'create', 'update', 'delete', 'signup'],
            // 设置actions的操作是允许访问还是拒绝访问
            'allow' => true,
            // @ 当前规则针对认证过的用户; ? 所有方可均可访问
            'roles' => ['@'],
        ],
        [
            'actions' => ['index'],
        'allow' => true,
            // 设置只允许操作的action
            'verbs' => ['POST'],
        ],
    ],
],
我们新增加的一条规则,设置了AccessRule::verbs属性即可。
注意哦,ACF 自上向下逐一检查规则,直到匹配到一个规则。也就是说如果你这里把verbs的actions index也添加一份到上面的那一条规则,verbs这条规则就相当于废掉了!
2、假设更新操作update只有用户test1可以访问,其他用户不可以访问
我们现在只有一个用户test1, 为了实现命题,在添加一个新用户test2
'access' => [
    'class' => AccessControl::className(),
    'rules' => [
        [
            // 当前rule将会针对这里设置的actions起作用,如果actions不设置,默认就是当前控制器的所有操作
            'actions' => ['index', 'view', 'create', 'delete', 'signup'],
            // 设置actions的操作是允许访问还是拒绝访问
            'allow' => true,
            // @ 当前规则针对认证过的用户; ? 所有用户均可访问
            'roles' => ['@'],
        ],
        [
            'actions' => ['update'],
            // 自定义一个规则,返回true表示满足该规则,可以访问,false表示不满足规则,也就不可以访问actions里面的操作啦
            'matchCallback' => function ($rule, $action) {
                return Yii::$app->user->id == 1 ? true : false;
            },
            'allow' => true,
        ],
    ],
],
Yii2框架ACF(AccessControl Filter)的使用的更多相关文章
- Yii2框架实现计数器功能
		思路: 因为yii2框架没有像tp框架那样的setinc这样的累加函数,所以只能在每次累加之前查出当前的这个字段的值,然后写算法累加入库 例如: 
- 关于yii2框架活动记录activeRecord添加默认字段的问题
		平时使用sql的时候可以如下添加默认字段flag: "select a.*,0 as flag from user_info a", 对于yii2框架则需要这样: $query = ... 
- Yii2框架RESTful API教程(二) - 格式化响应,授权认证和速率限制
		之前写过一篇Yii2框架RESTful API教程(一) - 快速入门,今天接着来探究一下Yii2 RESTful的格式化响应,授权认证和速率限制三个部分 一.目录结构 先列出需要改动的文件.目录如下 ... 
- Yii2框架RESTful API教程(一) - 快速入门
		前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下<Yii 2.0 权威指南 >,发现上面写得比较简略.所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RE ... 
- [PHP]Yii2框架的坑
		[PHP]Yii2框架的坑.md-/Users/zjh/Documents/我的文章/[PHP]Yii2框架的坑 html{font-family: sans-serif;-ms-text-size- ... 
- Yii2框架与MongoDB拓展、Redis拓展的安装流程
		@author 周煦辰 2016-03-21 这段时间新上了一个项目,使用的是Yii2框架.这里记录一下Yii2框架.Yii2-Mongo拓展.Yii2-Redis拓展等的安装流程.因为使用的系统是W ... 
- yii2框架安装
		注意:先把php.ini里面的php_openssl.dll扩展打开 1.下载yii2框架的文件包yii-advanced-app-2.0.7 2.打开路径为advanced下面的init.bat ... 
- nginx完美支持yii2框架
		nginx完美支持yii2框架 server {listen 80;server_name www.peita.net peita.net;# default_server;access_log /d ... 
- YII2框架动态创建表模型
		YII2框架动态创建表模型 在YII2中,每个表对应一个model类 在开发过程中,我们在填写一个大型表单的时候,表单里有N个select下拉列表,每个下拉select来自于不同的表: 如果要在程序里 ... 
随机推荐
- ASPNET 5 和 dnx commands
			DNX项目是用来创建和运行.net应用程序适用于windows,mac 和linux 的,dnx提供了一个宿主进程(a host process),CLR托管逻辑( CLR hosting logic ... 
- 服务器大量的fin_wait1 状态长时间存在原因分析-1
			上文描述了在出现大量fin-wait-1出现的原因,占用的内存等,这里讲一下如何处理这种情况. 首先,fin发送之后,有可能会丢弃,那么发送多少次这样的fin包呢?fin包的重传,也会采用退避方式,在 ... 
- Redis-安装、启动
			安装Redis 下载redis安装包http://download.redis.io/redis-stable.tar.gz 解压安装包tar xzf redis-stable.tar.gz 安装cd ... 
- Redis跟Spring整合,sentinel模式
			普通模式整合 一.在pom.xml中引入redis的依赖 <dependency> <groupId>org.springframework.data</groupId& ... 
- python_如何派生内置不可变类型并修改实例化行为
			案例: 我们想要自定义新类型的元组,对传入的可迭代对象我们只保留其中的int类型并且值大于0的元素,如下: [1, -2, 'xxx', 7, [1, 'oo'], 9] >> (1, ... 
- logback使用配置详解
			title: logback使用配置详解 date: 2017-04-25 16:42:49 tags: 日志 --- 1.介绍 Logback是由log4j创始人设计的另一个开源日志组件,它当前分为 ... 
- mysql关于char和varchar的查询效率问题
			看了好多资料都说 varchar(size) 可变长度的字符值,节省空间,查询效率低 char(size) 固定长度的字符值,浪费空间,查询效率高 但是实际测试 char(100) varcha ... 
- 深入理解Java虚拟机读书笔记(一)- java内存区域和垃圾收集
			jvm内存模型如下图 垃圾回收: 方法区: 这部分的垃圾回收性价比低,一般不要求回收,暂认为是永久代 heap:新生代和永久代之分.永久代主要回收废弃常量和无用的类. 垃圾回收算法: 1. 标记-清除 ... 
- 04_Javascript初步第二天(上)
			全局函数 isFinity() - 检测是否是无穷值(+infinity,-infinity,NaN返回false): isNaN() - 检测是否为数值 encodeURI(uri) - 将字符串编 ... 
- linux基本语法和常用运维命令
			linux上的操作一般是命令行操作,看起来很高大上,让人畏而远之. Help!Help! 忽然间闯入的linux黑黑的世界,怎么办,不要慌.赶紧敲出一个help命令,然后回车,黑色的窗口就会展示一些常 ... 
