@MarkLb

Как грамотно реализовать блокировку с помощью RBAC Yii2?

Здравствуйте. Стоит вопрос о том, как грамотно реализовать блокировку при помощи RBAC Yii2?

Есть группа "Заблокированные", и собственно у меня возникла проблема с грамотным подходом. На данный момент придумал 3 подхода, 1 и 2 более костыльные, 3-ий кажется более реальным, но к нему вопрос.

Подходы:
1. Реализовать валидатор проверки группы при авторизации. Но стоит вопрос о том, что блокировка будет применяться после повторной авторизации пользователя. Поскольку для сессий используются файлы, не БД - с удалением ее тоже будут трудности.
2. В boostrap-секцию настроек добавить компонент, который будет проверять группу пользователя. С таким подходом, по-идеи, при каждом запросе будет генерироваться +1 запрос к базе данных. Можно, конечно, использовать кэши, но тут опять таки ряд проблем с немгновенной блокировкой, и в любом случае лишняя нагрузка останется.
3. В конфигурации, в as access добавить правило для отключения доступа ко всему группе заблокированных. Но встает вопрос если я в Behaivor's Controller'а буду определять свой набор правил AccessControl - не слетят ли глобальные конфигурации?
  • Вопрос задан
  • 261 просмотр
Пригласить эксперта
Ответы на вопрос 2
kimono
@kimono
Web developer
В правилах доступа в контроллерах можно добавить matchCallback, где проверять статус пользователя:
'accessControl' => [
  'class' => AccessControl::class,
  'rules' => [
    [
      'allow' => true,
      'roles' => ['@'],
      'matchCallbak' => function($rule, $action){
        return Yii::$app->user->identity->status !== User::STATUS_BLOCKED;
      }
    ]
  ],
],
Ответ написан
qonand
@qonand
Software Engineer
Ох что-то Вы намудрили, зачем пользователя помещать в какую-то специальную группу RBAC? Заблокированные пользователи - это пользователи которые вообще не имеют доступ к сайту, поэтому вполне логично было бы вынести статус блокировки в модель пользователя и проверять его в findIdentity
Ответ написан
Ваш ответ на вопрос

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

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