arogachev/yii2-rbac

Yii 2 框架的 RBAC 管理

安装: 1,311

依赖: 0

建议者: 0

安全: 0

星标: 4

关注者: 2

分支: 4

开放问题: 1

类型:yii2-extension

0.1.0 2015-12-29 03:23 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:53:42 UTC


README

Yii 2 框架的 RBAC 管理。

本扩展的主要目的是通过配置数组提供 RBAC 角色管理、权限、规则及其之间的相互关系。

Latest Stable Version Total Downloads Latest Unstable Version License

安装

安装此扩展的首选方式是通过 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',
    ],
];

填写时必须填写 namedescription

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',
    ],
];

填写时必须填写 namedescriptionrule 是可选的。

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 制作的,如果它不符合您的需求,您可以复制它并按您希望的方式修改,它只是一个模板。

要为该操作创建链接,通常,扩展 GridViewActionColumn 就足够了

[
    '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',
            ]);
        },
    ],
],