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),敬请期待吧。

[考虑目前国内网站大部分采集文章十分频繁,更有甚者不注明原文出处,原作者更希望看客们查看原文,以防有任何问题不能更新所有文章,避免误导!]

  

时间: 2024-08-23 23:21:21

yii2项目实战-访问控制过滤器ACF讲解的相关文章

yii2项目实战-路由美化以及如何正确的生成链接

yii2项目实战-路由美化以及如何正确的生成链接 更新于 2016年12月17日 by 白狼 被浏览了 705 次 美化路由 何为美化路由呢?美化嘛,无外乎就是给路由化化妆,让她好看点.我虽没化过妆,那好歹也是见过描描眉的.下面我们就来看看如何给你的路由添加添加点"颜色"的. yii的路由美化工作,全权由urlManager组件负责.默认情况下,该组件并没有开启. 我们在配置文件backend\config\main.php中简单配置下该组件 'urlManager' => [

Spark进阶 大数据离线与实时项目实战 完整版

第1章 课程介绍&学习指南本章会对这门课程进行说明并进行学习方法介绍. 第2章 Redis入门Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度.本章将从Redis特性.应用场景出发,到Redis的基础命令,再到Redis的常用数据类型实操,最后通过Java API来操作Redis,为后续实时处理项目打下坚实的基础... 第3章 HBase入门HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:

Linux程序设计从入门到精通(理论讲解+实际演示+项目实战)视频教程

Linux程序设计从入门到精通(理论讲解+实际演示+项目实战)视频教程下载    联系QQ:1026270010 本门课程的最终目的: 这门课程主要突出“实用”的C语言,即我们重点详细讲解真实项目开发和运用中实际运用的C语言知识,及容易犯错的地方,包括对一个C程序怎么去调试的技术.这有别于大学里直接去讲诉C语言的内容,也有别于全国计算机考试二级C里针对考试的C课程.这是一门实用的C语言课程,是你以后从事C语言开发过程中最需要的知识.当然,如果这个课程你认真的听过之后,面对大学的课程或者全国计算机

net core体系-web应用程序-4asp.net core2.0 项目实战(1)-13基于OnActionExecuting全局过滤器,页面操作权限过滤控制到按钮级

1.权限管理 权限管理的基本定义:百度百科. 基于<Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员.后台管理员同时登录>我们做过了登录认证,登录是权限的最基础的认证,没有登录就没有接下来的各种操作权限管理,以及数据权限管理(暂不探讨),这里我们把登录当作全局权限,进入系统后再根据不同的角色或者人员,固定基本功能的展示,当不同的角色要对功能操作时,就需要验证操作权限,如:查看/添加/修改/删除,也就是我们常说的控制到按钮级.下面让我们一步一步来操作

OSPF协议项目实战讲解(可跟做)-第一篇

OSPF协议项目实战讲解-第一篇 1.要求按照下列标准配置一个OSPF网络2.配置一个IP网络,实验逻辑图如图,IP地址见拓扑图3.路由协议采用OSPF,进程ID为1 ,RID为loopback0地址4.R1/R2/R3相连的三个站点链路OSPF网络类型配置成广播型,其中R1路由器做为永久性DR 5.按照图示配置OSPF区域,其中R2/R3/R4之间的区域要配置成完全末梢区域6.R6为新并入的站点,由于来不及布线施工而暂时并到R5这个站点上,所在区域为AREA 56,配置使得所有网络可达(采用p

实用嵌入式C Linux程序设计从入门到精通(理论讲解+实际演示+项目实战)

课程讲师:百姓课程分类:其他适合人群:初级课时数量:60课时更新程度:完成用到技术:Linux涉及项目:Linux网络编程 对这个课程感兴趣的可以加我qq2059055336 第一部分(C语言基础) 第一讲:C语言简介及一个简单的C程序---------------------1学时 第二讲:数据类型.运算符和表达式.位运算--------------2学时 第三讲:流程控制-----------------------------------------------------2学时 第四讲:

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程

原文:[.NET Core项目实战-统一认证平台]第十二章 授权篇-深入理解JWT生成及验证流程 [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4密码授权模式,从使用场景.原理分析.自定义帐户体系集成完整的介绍了密码授权模式的内容,并最后给出了三个思考问题,本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的,如何验证access_token的有效性,最后我们使用.net webapi来实现一个外部接口(本来想用JAVA来实现的,

Kafka项目实战-用户日志上报实时统计之应用概述

1.概述 本课程的视频教程地址:<Kafka实战项目之应用概述> 本课程是通过一个用户实时上报日志来展开的,通过介绍 Kafka 的业务和应用场景,并带着大家搭建本 Kafka 项目的实战开发环境.下面我们来看看本课程有哪些课时,如下图所示: 接下来,我们开始第一课时的学习:<Kafka 回顾>. 2.内容 2.1 Kafka 回顾 本课时简述 Kafka 平台部署的注意事项,以及 Kafka 在企业中的业务场景和应用场景.让大家了解 Kafka 在企业中的使用. 本课时主要包含以

【思库教育】2017PHP项目实战基础+进阶+项目之基础篇

下载链接: [思库教育]2017PHP项目实战基础+进阶+项目之基础篇 小白变大牛,您的专属资源库! 小白变大牛,您的专属资源库! 内容非常充实,可以看目录,设计的面多,项目多,技能多,如果掌握好,找一份PHP的工作,易如反掌!学完后可以到PHP小白变大牛精华区查找更加符合你的资源或者项目! [思库教育]2017PHP项目实战基础+进阶+项目之基础篇[思库教育]2017PHP项目实战基础+进阶+项目之进阶篇[思库教育]2017PHP项目实战基础+进阶+项目之项目篇小白变大牛!Python小白,J