zoukankan      html  css  js  c++  java
  • Yii2框架ACF(AccessControl Filter)的使用

    AccessControl其实也就是 yiifiltersAccessControl Filter, 我们下面简写为 ACF 作为描述。

    ACF,访问控制过滤器,适用于简单的验证,面对的对象便是控制器的action。对于一些复杂的验证方式,我们后面会说到 Role Based Access Control (rbac),即基于角色的权限控制。

    接下来我们就上面抛出的问题进行解析。

    有同学要质疑了,创建新用户的操作,肯定要后台管理才可以进行操作,包括列表页等一系列操作,没登录肯定不能访问啊啊啊。

    不急,下面我们就看看如何通过ACF去对 user-backend/* 的系列操作进行授权限制!

    打开backendcontrollerSiteController.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的方式附加在当前控制器。

    不妨打开yiifiltersAccessControl.php文件,init方法中我们看到 配置项rules在使用之前,都会被创建为 yiifiltersAccessRule 的对象。

    也就是说我们实际的配置应该是这样的

    'rules' => [
        [
            'class' => 'yiifiltersAccessRule',
            'actions' => ['login', 'error'],
            'allow' => true,
        ],
    ],
    

    通过配置一文,很容易就猜到 这里的actions和allow就是 AccessRule的属性了。

    接着我们看到实际的请求过滤是在beforeAction中进行的!也就是说,在beforeAction中加了一层过滤的条件规则!

    如此一来,整个过滤的流程你是不是感觉到清晰了好多,但是还没有完,我们还没有说具体的过滤规则,从init方法中,我们了解到具体的规则即是 yiifiltersAccessRule 类的属性了。也就是说,规则怎么写,就要看你怎么设定accessRule的属性了!属性怎么设置?打开 yiifiltersAccessRule文件,看每一个具体的注解!这里就不说了,因为注解已经写得非常详细了,说多了自然就累赘,不好不好。

    那接下来我们就解决问题,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,
            ],
        ],
    ],
    
  • 相关阅读:
    Roce ofed 环境搭建与测试
    Ubuntu 1804 搭建NFS服务器
    Redhat 8.0.0 安装与网络配置
    Centos 8.1 安装与网络配置
    SUSE 15.1 系统安装
    VSpare ESXi 7.0 基本使用(模板、iso、SRIOV)
    VSpare ESXi 7.0 服务器安装
    open SUSE leap 15.1 安装图解
    KVM虚拟机网卡连接网桥
    GitHub Action一键部署配置,值得拥有
  • 原文地址:https://www.cnblogs.com/peteremperor/p/6547293.html
Copyright © 2011-2022 走看看