carono/yii2-rbac

Yii2 RBAC extension

Maintainers

👁 carono

Package info

github.com/carono/yii2-rbac

Type:yii2-extension

pkg:composer/carono/yii2-rbac

Statistics

Installs: 2 190

Dependents: 2

Suggesters: 0

Stars: 3

Open Issues: 0

1.3.1 2026-05-13 08:45 UTC

Requires

Requires (Dev)

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT 99299a10490fff82999dacbf6368d4964f4d2714

extensionyii2


README

Очередная реализация RBAC для yii2.

ВВЕДЕНИЕ

Этот компонент помогает распределить доступы по конкретным action в контроллерах по ролям, в конфигах прописываются доступы, выполняется команда для сброса прав, и база наполнена всеми указанными ролями, контроллерами и акшенами. Можно не прописывать каждый action в конкретном контроллере, а указать '*' и команда соберёт все возможные.

УСТАНОВКА

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

КАК ПРИМЕНЯТЬ

В behaviors контроллера, можно использовать фильтр, который идет в комплекте

 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, так же может быть primaryKey модели или username

РАБОТА С ADVANCED РЕДАКЦИЕЙ

Не сильно отличается от 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
 ]
 ],
 ]