文件版rbac(简单)
适用于简单少量功能的权限系统
配置
common/config/main.php
<?php
return [
// ...
'components' => [
'authManager' => [
'class' => 'yii\rbac\PhpManager',
],
// ...
],
];
新建rbac目录
yii\rbac\PhpManager 默认将 RBAC 数据保存在 @app/rbac 目录下的文件中。
assignments.php(分配角色)
<?php
/**
* 给user 分配角色
*/
return [
// 100,101 是user_id
100 => ['admin'],
101 => ['basic']
];
items.php(角色与权限)
<?php
return [
'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',
]
]
];
校验
<?php
if (\Yii::$app->user->can('system/system/index')) {
// 更新帖子
}
数据库版rbac(复杂)
配置
common/config/main.php anvance版只需要在此配置一次
<?php
return [
'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,用户是否可以允许访问此路径
<?php
public 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;
}