Name Last Update
..
behaviors Loading commit data...
controllers Loading commit data...
interfaces Loading commit data...
messages/en Loading commit data...
views Loading commit data...
LICENSE Loading commit data...
README.md Loading commit data...
Yii2DbRbac.php Loading commit data...
composer.json Loading commit data...

README.md

Динамическая настройка прав доступа для Yii2

Модуль для создания ролей и прав доступа через веб-интерфейс, так же имеющий веб интерфейс для назначения ролей пользователям Поведение для приложения, проверяющее право доступа к action по внесенным в модуле правилам.

###Установка:###

$ php composer.phar require developeruz/yii2-db-rbac "*"

Для корректной работы модуля необходимо настроить authManager в конфиге приложения (common/config/main.php для advanced или config/web.php и config/console для basic приложения)

    'components' => [
       'authManager' => [
          'class' => 'yii\rbac\DbManager',
        ],
    ...
    ]

И выполнить миграции, создающие таблицы для DbManager (подразумевается, что коннект к БД для приложения уже настроен)

$ yii migrate --migrationPath=@yii/rbac/migrations/

##Подключение модуля## В конфиге приложения (backend/config/main.php для advanced или config/web.php для basic приложения) прописываем модуль

  'modules' => [
        'permit' => [
            'class' => 'developeruz\db_rbac\Yii2DbRbac',
        ],
    ],

Если нужно передать layout это можно сделать так:

  'modules' => [
        'permit' => [
            'class' => 'developeruz\db_rbac\Yii2DbRbac',
            'layout' => '//admin'
        ],
    ],

Если вы используете ЧПУ, то убедитесь что у вас прописаны правила роутинга для модулей

'<module:\w+>/<controller:\w+>/<action:(\w|-)+>' => '<module>/<controller>/<action>',
'<module:\w+>/<controller:\w+>/<action:(\w|-)+>/<id:\d+>' => '<module>/<controller>/<action>',

Добавляем ссылки в меню

/permit/access/role - управление ролями

/permit/access/permission - управление правами доступа

###Назначение ролей пользователям### По многочисленным просьбам в модуль добавлен интерфейс для назначения ролей пользователям.

Для корректной работы модуля нужно указать в параметрах модуля класс User.

'modules' => [
        'permit' => [
            'class' => 'app\modules\db_rbac\Yii2DbRbac',
            'params' => [
                'userClass' => 'app\models\User'
            ]
        ],
    ],

Класс User должен реализовывать интерфейс developeruz\db_rbac\interfaces\UserRbacInterface. В большинстве случаев придется дописать в нем 1 функцию getUserName() которая будет возвращать отображаемое имя пользователя.

use developeruz\db_rbac\interfaces\UserRbacInterface;

class User extends ActiveRecord implements IdentityInterface, UserRbacInterface
{
...
    public function getUserName()
    {
       return $this->username;
    }
}

Управление ролью пользователя происходит на странице /permit/user/view/1 для пользователя с id=1. Удобнее всего дописать кнопку на эту страницу в Grid со списком пользователей.

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'columns' => [
        ['class' => 'yii\grid\SerialColumn'],

        'id',
        'username',
        'email:email',

        ['class' => 'yii\grid\ActionColumn',
         'template' => '{view}&nbsp;&nbsp;{update}&nbsp;&nbsp;{permit}&nbsp;&nbsp;{delete}',
         'buttons' =>
             [
                 'permit' => function ($url, $model) {
                     return Html::a('<span class="glyphicon glyphicon-wrench"></span>', Url::to(['/permit/user/view', 'id' => $model->id]), [
                         'title' => Yii::t('yii', 'Change user role')
                     ]); },
             ]
        ],
    ],
]);

Присвоить роль пользователю можно и в коде, например при создании нового пользователя.

$userRole = Yii::$app->authManager->getRole('name_of_role');
Yii::$app->authManager->assign($userRole, $user->getId());

Проверить, имеет ли пользователь право на действие можно через метод can() компонента User

Yii::$app->user->can($permissionName);

$permissionName - может быть как ролью так и правом

##Поведение, динамически проверяющее наличие прав##

Данное поведение позволяет не писать Yii::$app->user->can($permissionName); в каждом action, а проверять права доступа на лету. Это удобно для гибкой настройки прав при использовании сторонних модулей.

###Подключение поведения### В конфиге того приложения, доступ к которому следует проверять на лету, необходимо подключить поведение

use developeruz\db_rbac\behaviors\AccessBehavior;

 'as AccessBehavior' => [
        'class' => AccessBehavior::className(),
 ]

С этого момента, после обработки запроса (событие EVENT_AFTER_REQUEST) проверяются права текущего пользователя (Yii::$app->user) на выполнение запрашиваемого действия (Yii::$app->user->can()) Действие считается разрешенным, если:

  • пользователю разрешен доступ к конкретному action (правило записано как: module/controller/action)
  • пользователю разрешен доступ к любым action данного контроллера (правило записано как: module/controller)
  • пользователю разрешен доступ к любым action данного модуля (правило записано как: module)

###Настройка прав доступа по умолчанию### После подключения поведения, доступ становится возможен только авторизованному пользователю, имеющему некие права. Для исключений из этого правила можно прописать доступы по умолчанию в том же формате AccessControl, что и в контроллере:

    'as AccessBehavior' => [
        'class' => AccessBehavior::className(),
        'rules' =>
            ['site' =>
                [
                    [
                        'actions' => ['login', 'index'],
                        'allow' => true,
                    ],
                    [
                        'actions' => ['about'],
                        'allow' => true,
                        'roles' => ['admin'],
                    ],
                ]
            ]
    ]

В приведенном выше примере разрешен доступ любому пользователю к site/login и site/index и доступ пользователя с ролью admin к site/about Правила прописанные в конфиге имеют приоритет над динамически настраиваемыми правилами.