another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

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

Возникла необходимость иметь в базе одного юзера, но с несколькими ролями и возможностью переключаться между доступными, например, при клике на кнопку с названием соответствующей роли.
Роль необходимо менять на время сессии или до переключения на другую роль.
Возможно кто-то сталкивался с подобным?

Yii2. Используем RBAC.
  • Вопрос задан
  • 302 просмотра
Решения вопроса 1
another_dream
@another_dream Автор вопроса
Backend-разработчик, Laravel/ZF2/Yii2
Переопределил компонент authManager и расширил класс DbManager:
<?php
namespace common\rbac;

use Yii;
use yii\rbac\DbManager as YiiDbManager;

class DbManager extends YiiDbManager
{
    /**
     * Выбранная роль
     * @var
     */
    protected $currentRole;

    /**
     * Немного переопределим инициализацию, чтобы узнать какую роль установил юзер
     */
    public function init()
    {
        parent::init();

        if (is_null($this->currentRole)) {
            // Здесь проставим выбранную роль для юзера
           // Пока что вручную, потом данный параметр будет подтягиваться из сессий, к примеру
            $this->currentRole = 'buyer';
        }
    }


    /**
     * Определим какую из ролей пользователя выдать под текущий запрос
     * @param $userId
     * @return array
     */
    public function getAssignments($userId)
    {
        // Доступные пользователю роли
        $allAssignments = parent::getAssignments($userId);
        // Какую роль он предпочёл в этот раз
        $currentRole = $this->currentRole;

        // Найдём в доступных ролях требуемую
        $assignments = array_filter(
            $allAssignments,
            function ($key) use ($currentRole) {
                return $key === $currentRole;
            },
            ARRAY_FILTER_USE_KEY
        );

        // Если роль не нашлась, то используем первую из доступных
        if (empty($assignments)) {
            $assignments = array_shift($allAssignments);
        }

        return $assignments;
    }
}

Вышеприведённое решение со своей задачей справляется успешно.
Есть замечания? Буду благодарен за конструктивную критику или альтернативные варианты.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
А в чем проблема?
Вариант 1 - Создаем права на переключение роли, кто может, кто нет и т.д. Переключился - сменили роль.
Второй вариант - в Yii предусмотрено что 1 пользователь может иметь 2 и более ролей, и можно допилить некий идентификатор activeRole, но придется переписать многое.
Ответ написан
Ваш ответ на вопрос

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

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