YII2 RBAC ACF 学习记录

首先 使用迁移命令 创建RBAC所需要的四张表:http://www.yiiframework.com/doc-2.0/guide-security-authorization.html

1
yii migrate --migrationPath=@yii/rbac/migrations

四张表分别是:

  • auth_assignment (任命,用户和角色的关系)
  • auth_item(角色和权限存放的表,type=1的为角色,type=2的为权限)
  • auth_item_child(角色和权限的关系表,parent和child存放的是auth_item中的name值,因此该值也可能是权限  一个权限属于另一个权限)
  • 比如:作者可以修改自己创建的文章,这时需要判断文章是否为该作者创建。但如果直接付给用户编辑权限 是不科学的
  • 这时创建一个更改自己文章的权限,然后赋给作者 这样根据 这个权限找到更改文章的权限
  • 同时更改自己文章这个权限需要配合规则去完成验证
  • auth_rule(用一段代码来确定权限)
  • 如:作者可以更改自己创建的文章

 

在 components 中配置 authManager

1
2
3
        'authManager'=>[
        	'class'=>'yii\rbac\DbManager'
        ]

 

在控制器中执行权限检查

通过 Yii:$app->user->can(“权限”) 来检查是否拥有指定权限

通过yii\rbca\ManagerInterface::checkAccess(uid,privilegename) 对指定用户进行检测

RBAC规则验证流程

一.根据当前登录的用户ID(或指定的)找出该用户拥有的角色(auth_assignment表)

二.根据需要检测的权限(/角色),称作A,找出该权限(/角色)的具体信息(auth_item表)

三.判断2中找到的权限(/角色)是否有rule规则( ruleName 不为空)

1.如果具有规则,则按照规则验证并返回是否满足,如果不满足则直接返回false

2.如果没有规则则进入第四步

四.判断需要检测的 权限/角色(检测过程中两者会发生反转)是否在第一步中 , 如果在则返回true 否则进入第五步

五.在角色权限关系表中查找A(即child字段)对应的parent 然后返回第二步继续校验(逐个进行)

总结出来一句话:通过USERID 找出该用户所有的角色+默认角色   ,再根据操作的权限找出拥有该权限的角色/权限  ,再来判断 当前用户操作的权限 是否再角色列表中。

ACF(存取控制过滤器) 权限控制 http://www.yiiframework.com/doc-2.0/yii-filters-accesscontrol.html

ACF 通过yii\filters\AccessControl类来实现授权 适用于简单的存取控制应用

通过在控制器的behaviors方法中设定规,当用户请求一个动作时候ACF会检查存取规则,判断当前用户是否有执行权限

? 表示未经认证的访客用户 (未登录) @ 已认证用户

配置方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
    public function behaviors()
    {
 
        return [
 
            'access'=>[
                'class'=>AccessControl::className(),
                // 'only'=>['index','view','update','create','delete','good'], //仅对这些控制器应用ACF 留空表示全部
                // 'except'=>'show', //那些控制器不应用ACF 同时出现在only中 except 优先
                // 'ruleConfig'=>[],//默认的规则
                 // 'user'=>Yii::$app->user, // 默认用 components 中  authManager指定 RBAC 权限控制类 $user = Yii::$app->user  然后在 rules中的roles指定一个操作权限名
                // 最后在AccessRule中的 matchRole中进行 $user->can('createPost');
                //规则
                'rules'=>[
                    [
                        'actions'=>['index','view'],
                        'allow'=>true,
                        'roles'=>['?'],
                        'ips'=>[
                            '127.0.0.*'
                        ],
                        'denyCallback'=>function($rule, $action){
                            p(1); //2.0.11 版本 -- 在 AccessControl中的beforeAction 始终没有调用该回调
                        },
                        // ''
 
 
                    ],
                    [
                        'actions'=>['index','view','update','create','delete'],
                        'allow'=>true,
                        'roles'=>['createPost'], //createPost rbca中的权限
                    ],
                    [
                        'actions'=>['good'],
                        'allow'=>true,
                        'matchCallback'=>function ($rule, $action){
                             return date('Y-m')=="5-31";
                        }
                    ]
                ],
                // 'denyCallback'=>function($rule, $action){
                //     // p($action); 如果不指定登录用户调用 ForbiddenHttpException 未登录则跳转到登录页面$user->loginRequired();
                // }
 
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }
 
 
 
    public function actionGood()
    {
        echo "string";
    }

未经允许不得转载:开心乐窝-乐在其中 » YII2 RBAC ACF 学习记录

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏