首先 使用迁移命令 创建RBAC所需要的四张表:http://www.yiiframework.com/doc-2.0/guide-security-authorization.html
1 | yii migrate --migrationPath=@yii/rbac/migrations |
四张表分别是:
- 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 学习记录