carono / yii2-rbac
Yii2 RBAC 扩展
Requires
- carono/yii2-behaviors: @stable
- yiisoft/yii2: ~2.0
README
这是yii2的一个RBAC实现。
简介
该组件可以帮助根据角色在控制器中分配权限,配置文件中指定权限,执行权限重置命令,数据库中填充所有指定角色、控制器和动作。可以不必在特定控制器中指定每个动作,而是使用'*',命令将收集所有可能的动作。
安装
composer require carono/yii2-rbac
请记住迁移表
yii migrate --migrationPath=@yii/rbac/migrations
配置
在 config/console.php
中为 basic 编辑版,以及 console/main.php
中为 advanced,指定
'components' => [
'authManager' => [
// Настраиваем менеджер, чтобы можно было в консоли работать с правами
'class' => 'yii\rbac\DbManager',
'defaultRoles' => ['guest', 'user'],
],
],
'controllerMap' => [
'rbac' => [
'class' => 'carono\yii2rbac\RbacController',
'roles' => [
'guest' => null,
'user' => null,
'manager' => 'user',
'director' => ['parent' => 'manager', 'description' => 'Директор'], // Наследование директора от менеджера
'root' => null
],
'permissions' => [
'*:*:*' => ['root'], // Для рута доступны все контроллеры
'Basic:Site:*' => ['guest'], // Для гостя разрешены все actions у SiteController
'Basic:Director:*' => ['director'],
'updater_perm' => ['director'], // Простые доступы тоже можно создавать как обычно
'Basic:Manager:*' => ['manager'], // Будет доступно и директору, т.к. наследуется
'Basic:Director:Index' => ['manager'], // Только один action у DirectorController
'Ajax:*:*' => ['user'] // Модуль Ajax, все контроллеры разрешаем авторизованным
]
],
]
配置完成后,需要执行 yii rbac
命令以创建角色和控制器权限。如果配置文件中的设置已更改,则每次都需要调用该命令。所有角色和权限将重新创建。此时,已分配给用户的角色不会被删除。
在数据库中创建的权限类型为 Module:Controller:Action
,如果设置中指定了 '*' 任意部分,则会收集所有模块、控制器或动作。
特点
所有没有模块的控制器,仍然有一个模块,即 Yii::$app,因此 SiteController->actionIndex 形成的权限为 Basic:Site:Index
,如果在配置文件(web.php)中将应用程序的 id 从 basic 改为 my-app,则需要在控制器设置中相应地指定: MyApp:Site:Index
如何使用
在控制器的行为中,可以使用配套的过滤器
public function behaviors()
{
return [
'access' => [
'class' => RoleManagerFilter::className(),
]
];
}
或自行检查
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'matchCallback' => function ($rule, $action) {
return RoleManager::checkAccess($action);
}
],
],
],
];
}
帮助器
- RoleManager::formPermissionByAction(Yii::$app->controller->action) = Basic:Site:index
- RoleManager::checkAccessByUrl('/site/index?page=1', $user) = true,传递链接或数组,如 Url::to
- RoleManager::checkAccess('Basic:Site:Index', $user),也接受 Action 类
$user - 在配置文件中指定的类 - Yii::$app->user->identityClass,也可以是模型的主键或用户名
使用高级编辑版
与 basic 类似,但权限可以由 3 个或 4 个部分组成,Application:Module:Controller:Action
'controllerMap' => [
'rbac' => [
'class' => 'carono\yii2rbac\RbacController',
'roles' => [
'guest' => null,
'user' => null,
'manager' => 'user',
'director' => ['parent' => 'manager', 'description' => 'Директор'], // Наследование директора от менеджера
'root' => null
],
'permissions' => [
'*:*:*' => ['root'], // Для рута доступны все контроллеры как во frontend так и в backend
'AppFrontend:Site:*' => ['guest'], // Для гостя разрешены все actions у SiteController во frontend
'AppBackend:Director:*' => ['director'],
'AppFrontend:Ajax:*:*' => ['user'] // Модуль Ajax, все контроллеры разрешаем во frontend
'*:Site:Index' => ['guest'] // Разрешаем SiteController->index как во frontend так и backend
]
],
]