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,
            ],
        ],
    ],
    
  • 相关阅读:
    面试-23种设计模式
    面试-类和对象的区别
    面试-链表和数组的区别
    Python强制抛出自定义异常
    Python中模拟C# Linq的一些操作
    python随机数seed用法
    Python目录常用操作
    Unity编辑器下获取动画的根运动状态并修改
    python字符串操作,以及对应的C#实现
    测试-一个unity的编译bug,初始化器
  • 原文地址:https://www.cnblogs.com/peteremperor/p/6547293.html
Copyright © 2011-2022 走看看