yii2项目实战-访问控制过滤器ACF讲解
作者:白狼 出处:http://www.manks.top/document/yii2-filter-control.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 什么是访问控制过滤器?字面上来理解就是访问授权呗,对一些具体的操作设定一些规则进行权限控制。 当然,这里的【操作】即是指控制器的action了。 前面我们添加新用户的时候,不知你可有疑问:为什么我们访问主页(site/index)就让我们登录,但是我们在未登录的时候却可以直接添加用户,访问用户列表呢? 下面就请我们今天的主角 AccessControl 登场,噼里啪啦的鼓掌... AccessControl其实也就是 yii\filters\AccessControl, 我们下面简写为 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的方式附加在当前控制器。 行为是啥,我们在配置一文中就开始纠结行为,行为说白了,他就是一个类,通过某些操作,跟现有的类就行了一个绑定。 既然是绑定,自然就是你(行为类)可以用我的(当前类),我(当前类)也可以用你的(行为类)。具体细节,还是那句老话,到了该说的时候我们自然会说,现在说太多岂不是跑题了? 回归正题,我们看看AccessControl是怎样发挥作用的。 不妨打开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,
],
],
],
然后你可以通过test1和test2两个账号测试,会发现只有test1才可以访问update方法,test2就不允许对其进行访问了。 注:用户test1的userId等于1,用户test2的userId等于2 最后,我们不仅学会了ACF,也对user-backend/* 操作进行了部署。 思考一个问题,如果说我们的管理平台有100个controller, 每个controller有10个action, 如何处理这个授权的问题?如果又要限制某些用户(注意哦,某些可以指用户组)对某些操作有权限访问,另外一些不允许访问又该如何操作? 有人不怕麻烦:那我就加100个AccessControl, 然后第二个问题就写matchCallback, 这种答案简直就是在作死! 下一章,我们来简单了解下相对而言更强大一点的权限控制,基于角色的访问控制(rbac),敬请期待吧。 [考虑目前国内网站大部分采集文章十分频繁,更有甚者不注明原文出处,原作者更希望看客们查看原文,以防有任何问题不能更新所有文章,避免误导!]
yii2项目实战-访问控制过滤器ACF讲解的更多相关文章
- yii2项目实战-路由美化以及如何正确的生成链接
yii2项目实战-路由美化以及如何正确的生成链接 更新于 2016年12月17日 by 白狼 被浏览了 705 次 美化路由 何为美化路由呢?美化嘛,无外乎就是给路由化化妆,让她好看点.我虽没化过妆, ...
- Asp.Net Core 2.0 项目实战(11) 基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-13基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级
1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证, ...
- 项目实战 - 原理讲解<-> Keras框架搭建Mtcnn人脸检测平台
Mtcnn它是2016年中国科学院深圳研究院提出的用于人脸检测任务的多任务神经网络模型,该模型主要采用了三个级联的网络,采用候选框加分类器的思想,进行快速高效的人脸检测.这三个级联的网络分别是快速生成 ...
- 【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程
[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本 ...
- Kafka项目实战-用户日志上报实时统计之应用概述
1.概述 本课程的视频教程地址:<Kafka实战项目之应用概述> 本课程是通过一个用户实时上报日志来展开的,通过介绍 Kafka 的业务和应用场景,并带着大家搭建本 Kafka 项目的实战 ...
- 新书上线:《Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统》,欢迎大家买回去垫椅子垫桌脚
新书上线 大家好,笔者的新书<Spring Boot+Spring Cloud+Vue+Element项目实战:手把手教你开发权限管理系统>已上线,此书内容充实.材质优良,乃家中必备垫桌脚 ...
- SpringCloud微服务项目实战 - API网关Gateway详解实现
前面讲过zuul的网关实现,那为什么今天又要讲Spring Cloud Gateway呢?原因很简单.就是Spring Cloud已经放弃Netflix Zuul了.现在Spring Cloud中引用 ...
- JavaEE在职加薪课好客租房项目实战视频教程
JavaEE在职加薪课好客租房项目实战视频教程课程介绍: 本课程采用SOA架构思想进行设计,基于目前主流后端技术框架SpringBoot.SpringMVC.Mybaits.Dubbo等来 ...
随机推荐
- [Java.Web]Tomcat 常用配置
1. web.xml 文件最下方内容 (X:\apache-tomcat-7.0.77\conf\ 目录下) <welcome-file-list> <welcome-file> ...
- PHP字符串中的变量解析
定义字符串的时候,用单引号或者双引号都是可以的.我个人习惯是用双引号.在输出字符串的时候,若字符串中含有字符串变量,使用单引号和双引号则是有区别的.如下面程序: <?php $website = ...
- USB驱动程序之USB总线驱动程序学习笔记
USB总线驱动程序的作用 1. 识别USB设备 1.1 分配地址 1.2 并告诉USB设备(set address) 1.3 发出命令获取描述符 描述符的信息可以在include\linux\usb\ ...
- MVC、MVP、MVVM架构模式
MVC模式 如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architectural pattern),属于编程的方法论. MVC模式就是架构模式的一种,不仅适用于 ...
- ghostscript 远程命令执行漏洞复现
影响的版本 <= 9.23(全版本.全平台) Ubuntu 开启 ghostscript sch01ar@ubuntu:~$ gs -q -sDEVICE=ppmraw -dSAFER -s0u ...
- 史上最详细的HashMap红黑树解析
简介:请允许我当一回标题党.好了,言归正传,本篇主要内容便是介绍HashMap的男二号——TreeNode(男一号还是给Node吧,毕竟是TreeNode的爷爷,而且普通节点一般来说也比TreeN ...
- centos7.3查看时区
[root@iZ2ze3gf6h0zndx5dxyhqiZ ~]# date -R Fri, Apr :: + 即可查看时区 我们国家的东八区(+0800) 查看clock系统配置文件 [root@i ...
- 基于 DirectX11 的 MMDViewer 04-渲染目标视图和多视口
上篇文章给出了一个简单并且可以运行的渲染框架,接下来将介绍框架中的渲染管线构成. 1.创建渲染管线 在你创建完一个窗口后,接着便要创建渲染管线,使用的函数是 D3D11CreateDeviceAndS ...
- 201671010140. 2016-2017-2 《Java程序设计》java学习第十二周
java学习第十章:图形程序设计 本章,介绍的是如何编写使用图形用户界面GUI的java程序.主要讲的是如何编写定义屏幕上的窗口大小和位置的程序,如何在窗口中采用多种字体显示文本,如何显示 ...
- keepalived和zookeeper对比
https://blog.csdn.net/vtopqx/article/details/79066703keepalived与zookeeper都可以用来实现高可用,高可用一般跟负载均衡会一起考虑, ...