carono/yii2-rbac

Yii2 RBAC 扩展

安装量: 2,035

依赖者: 2

建议者: 0

安全性: 0

星标: 3

关注者: 4

分支: 1

开放问题: 0

类型:yii2-extension

1.1.7 2023-09-26 10:07 UTC

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