arogachev / yii2-rbac
Yii 2 框架的 RBAC 管理
Requires
- yiisoft/yii2: *
Requires (Dev)
- phpunit/dbunit: ~2.0
- phpunit/phpunit: ~5.1
This package is not auto-updated.
Last update: 2024-09-14 17:53:42 UTC
README
Yii 2 框架的 RBAC 管理。
本扩展的主要目的是通过配置数组提供 RBAC 角色管理、权限、规则及其之间的相互关系。
安装
安装此扩展的首选方式是通过 composer。
运行
php composer.phar require --prefer-dist arogachev/yii2-rbac
或添加
"arogachev/yii2-rbac": "*"
到您的 composer.json
文件的 require 部分。
功能
- 添加带有描述的新角色和权限
- 更新权限名称、描述和规则
- 删除权限、规则
- 更新角色描述
- 将规则分配给权限
- 将权限分配给角色
配置数组
首先,您需要创建三个文件来存储 RBAC 数据
roles.php
。用于存储角色。permissions.php
。用于存储权限以及权限和规则之间的关系。children.php
。用于存储角色和权限之间的关系。
您可以将其放置在您希望的任何位置。如果您正在使用高级应用程序,建议将其放置在 common/rbac/data
文件夹中。
roles.php
内容示例
<?php return [ [ 'name' => 'default', 'description' => 'Default', ], [ 'name' => 'admin', 'description' => 'Administrator', ], [ 'name' => 'operator', 'description' => 'Operator', ], ];
填写时必须填写 name
和 description
。
default
不是必需的,但大多数情况下都是需要的,因为某些权限需要在未分配的情况下进行检查。在这种情况下,请确保您已在应用程序配置中包含它
'authManager' => [ 'class' => 'yii\rbac\DbManager', 'defaultRoles' => ['default'], ],
permissions.php
内容示例
<?php return [ [ 'name' => 'users.manage', 'description' => 'Users management', ], [ 'name' => 'users.avatar.upload', 'description' => 'Upload avatar for user', 'rule' => 'arogachev\rbac\rules\CorrespondingUserRule', ], [ 'name' => 'users.avatar.upload.all', 'description' => 'Upload avatar for any user', ], [ 'name' => 'users.password.change', 'description' => 'Change password for user', 'rule' => 'arogachev\rbac\rules\CorrespondingUserRule', ], [ 'name' => 'users.password.change.all', 'description' => 'Change password for any user', ], [ 'name' => 'dispatching-room.access', 'description' => 'Access to dispatching room', ], [ 'name' => 'settings.manage', 'description' => 'Settings management', ], [ 'name' => 'sessions.access', 'description' => 'Sessions management', ], ];
填写时必须填写 name
和 description
,rule
是可选的。
children.php
内容示例
<?php return [ 'default' => [ 'users.password.change', ], 'admin' => [ 'users.manage', 'users.avatar.upload.all', 'users.password.change.all', 'settings.manage', 'sessions.access', ], 'operator' => [ 'users.avatar.upload', 'dispatching-room.access', 'chat.access', ], ];
数据同步
要同步实际 RBAC 数据与配置数组数据,请将以下内容添加到您的控制台应用程序配置中(基本应用程序的 config/console.php
和高级应用程序的 console/config/main.php
)
'controllerMap' => [ 'rbac' => [ 'class' => 'arogachev\rbac\controllers\RbacController', 'parserOptions' => [ 'configPath' => '@common/rbac/data', ], ], ],
然后,您需要运行以下命令
php yii rbac
parserOptions
中可用的选项列表
$configPath
- 包含配置文件的文件夹的完整路径。支持别名。必需。
规则
扩展提供了 arogachev\rbac\rules\CorrespondingUserRule
,可用于仅允许用户编辑自己的帖子等。它与官方文档中描述的 AuthorRule
类似。您可以将其附加到权限,如下所示,并在操作中使用它
/** * @param integer $id * @return string|\yii\web\Response * @throws BadRequestHttpException * @throws NotFoundHttpException */ public function actionUploadAvatar($id) { $model = $this->findModel($id); if (!Yii::$app->user->can('users.avatar.upload.all') && !Yii::$app->user->can('users.avatar.upload', [ 'model' => $model, 'attribute' => 'id', ])) { throw new BadRequestHttpException('You are not allowed to upload avatar for this user.'); } ... }
在使用模型后使用相关权限。
可用参数
$model
- 用于检查的模型。必需。attribute
- 包含用户 ID 的属性名称。默认为author_id
。
在使用高级应用程序的情况下,建议将此类通用规则放置在 common/rbac/rules
中。更具体的规则可以放置在相应的模块中。
GUI
您可以使用 AssignRoleToUserForm
将角色分配给用户。以下是动作示例(您可以将它放在 UsersController
中)
use arogachev\rbac\models\AssignRoleToUserForm; ... /** * Assign RBAC role to user * @param integer $id * @return string|\yii\web\Response * @throws NotFoundHttpException */ public function actionAssignRole($id) { $user = $this->findModel($id); $model = new AssignRoleToUserForm(['user' => $user]); if ($model->load(Yii::$app->request->post()) && $model->validate()) { $model->assignRole(); return $this->redirect('index'); } return $this->render('@rbac/views/users/assign-role', ['model' => $model]); }
还有 assign-role
和 _assign-role-form
(部分)视图,您可以使用它们。这是为 Bootstrap 制作的,如果它不符合您的需求,您可以复制它并按您希望的方式修改,它只是一个模板。
要为该操作创建链接,通常,扩展 GridView
的 ActionColumn
就足够了
[ 'class' => ActionColumn::className(), 'template' => '{view} {update} {assign-role} {delete}', 'buttons' => [ 'assign-role' => function ($url, $model, $key) { return Html::a('<span class="glyphicon glyphicon-link"></span>', $url, [ 'title' => 'Assign role', 'aria-label' => 'Assign role', 'data-pjax' => '0', ]); }, ], ],