文件版rbac(简单)
适用于简单少量功能的权限系统
配置
common/config/main.php
<?phpreturn [// ...'components' => ['authManager' => ['class' => 'yii\rbac\PhpManager',],// ...],];
新建rbac目录
yii\rbac\PhpManager 默认将 RBAC 数据保存在 @app/rbac 目录下的文件中。
assignments.php(分配角色)
<?php/*** 给user 分配角色*/return [// 100,101 是user_id100 => ['admin'],101 => ['basic']];
items.php(角色与权限)
<?phpreturn ['system/system/index' => ['type' => \yii\rbac\Item::TYPE_PERMISSION,'description' => '系统配置',],'system/job/list' => ['type' => \yii\rbac\Item::TYPE_PERMISSION,'description' => '任务列表',],'admin' => ['type' => \yii\rbac\Item::TYPE_ROLE,'description' => '超级管理员',// 权限组'children' => ['system/system/index','system/job/list',]],'basic' => ['type' => \yii\rbac\Item::TYPE_ROLE,'description' => '平台管理员','children' => ['system/system/index',]]];
校验
<?phpif (\Yii::$app->user->can('system/system/index')) {// 更新帖子}
数据库版rbac(复杂)
配置
common/config/main.php anvance版只需要在此配置一次
<?phpreturn ['components' => ['authManager' => ['class' => 'yii\rbac\DbManager'// uncomment if you want to cache RBAC items hierarchy// 'cache' => 'cache',]]];
执行migration
切换到根目录下 windows的cmd下执行 此操作会在mysql中新建相关的表,一定要提前配置好数据库
yii migrate --migrationPath=@yii/rbac/migrations // 输入yes// 生成的表数据介绍itemTable: 角色与权限表,其中权限可以理解为url路径,角色就是管理员,财务管理员之类的。itemChildTable: 该表存放授权条目的层次关系。默认表名为 "auth_item_child"。assignmentTable: 该表存放授权条目对用户的指派情况。默认表名为 "auth_assignment"。ruleTable: 该表存放规则。默认表名为 "auth_rule"
核心 authManager
通过配置一项,可以在yii中直接使用
可以通过 \Yii::$app->authManager 访问 authManager
增加权限
所谓权限可以理解为url路径,比如 site/index,用户是否可以允许访问此路径
<?phppublic function add(){$auth = Yii::$app->authManager;// 添加一个权限$pSiteIndex = $auth->createPermission('site/index');$pSiteIndex->description = '后台首页';$auth->add($pSiteIndex);// 添加一个角色$rAdmin = $auth->createRole('admin');$rAdmin->description = '超级管理员';$auth->add($rAdmin);// 将此权限赋值给此角色$auth->addChild($rAdmin, $pSiteIndex);// 为某个管理员赋予admin角色$auth->assign($rAdmin, 1);}
使用案例
适用于两种版本
需要所有的控制器都继承一个AuthController之类的,在其 beforeAction 中判断是否可以
<?php// 授权控制public function beforeAction ($action){// 父级的action是否已经阻止了请求if(! parent::beforeAction($action)){return false;}// Yii::$app->controller->action->uniqueId; 是获取包括模块在内的所有的路径// 如 version/version/add$permission_name = Yii::$app->controller->action->uniqueId;// 游客则允许跳转登录页 和 允许访问验证码$is_guest = Yii::$app->user->isGuest;if($is_guest && ($permission_name == 'site/login' || $permission_name == 'site/captcha')){return true;}// 还需要判断是否为登录页// 超级管理员 - 目前超级管理是全部的权限集合,没有设定all是全部if(! can($permission_name)){// todo something// 提示无权限throw new UserException("对不起,您现在还没获此操作的权限");}return true;}
