kublahanov
@kublahanov
Веб-разработчик

Как сделать динамическое определение роли в Yii2?

Дано:
Есть некоторое количество разноплановых сущностей (компании, инспекции, службы и пр.). Есть пользователи. Сущности связаны с некоторыми из пользователей через связующие таблицы. Привязки могут время от времени меняться. Таблица пользователей не содержит полей для определения роли пользователя, и создание дополнительных таблиц не предполагается.

Необходимо:
Добавить в Yii::$app->user->identity поле role, которое заполнялось бы во время авторизации пользователя, и, в дальнейшем, использовалось для простой проверки доступа к сущностям (если в таблице связи пользователей и некоторой сущности есть запись с данным UserId - присваиваем пользователю некую роль и когда потребуется проверяем её).

Хотелось бы сделать максимально просто, без использования дополнительных таблиц, без RBAC и расширений.
Проверку связи пользователя (определение его роли) сделать например так:

class User extends ActiveRecord implements IdentityInterface
{

    ...

    public function init()
    {
        parent::init();
        Yii::$app->user->on(WebUser::EVENT_AFTER_LOGIN, [$this, 'assignRole']);
    }

    public function assignRole()
    {
        if ($this) {

            $this->role = <Role ID>;
            ...


И получать значение роли в коде так:
if (Yii::$app->user->identity->role == User::SOME_ROLE) {
    // Do something
}


Как правильно это сделать?
  • Вопрос задан
  • 266 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
Если Вы хотите решить задачу правильно - используйте RBAC. То что Вы пытаетесь сделать это костыли. В попытке избежать "лишних" сущностей Вы движетесь в неправильном направлении. Ваше решение:
1. Уменьшает очевидность кода.
2. Уменьшает в целом гибкость и масштабируемость системы.
3. Лишает возможности встроенного кеширования данных доступа, Вы его сами планируете реализовывать?
4. Лишает возможности проверки доступа к экшенам с помощью AccessControl, или Вы планируете в каждом экшене писать кучу if-ов для проверки доступа?
и еще можно написать много разных пунктов. По сути дела Вы сейчас спрашиваете "как правильно забить рубанком гвоздь?" ответ - правильно никак, для этого нужно использовать молоток.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы