Статусы и rbac

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

Статусы и rbac

Сообщение Chelobaka »

Здравствуйте господа знатоки.

Для редактирования статей в блоге есть 3 роли, редактор, админ и автор. (rbac)

При создании статьи статус = новая.

При создании автор может создать и потом отредактировать на статус = отмена

У редактора есть возможность поставить статус как у атора + статус = опубликована.

У админа есть все эта статусы + статус = проверена.

:?: Как сделать так что бы автор видел 2 статуса, редактор 3 и админ 4 статуса?

Спасибо.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Статусы и rbac

Сообщение yiiliveext »

Привязывайте статусы к разрешениям и формируйте список используя user->can(...). Этот вариант позволяет безболезненно добавлять новые роли, список всегда будет корректным.
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

Re: Статусы и rbac

Сообщение Chelobaka »

yiiliveext писал(а): 2019.09.27, 14:36 Привязывайте статусы к разрешениям и формируйте список используя user->can(...). Этот вариант позволяет безболезненно добавлять новые роли, список всегда будет корректным.
То есть на каждый статус добавлять if? Такой вариант не годится. Каждый раз переписывать класс это не наш метод.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Статусы и rbac

Сообщение yiiliveext »

Chelobaka писал(а): 2019.09.30, 15:23 То есть на каждый статус добавлять if? Такой вариант не годится. Каждый раз переписывать класс это не наш метод.
В цикле по списку статусов. Конкретика зависит от того как вы храните статусы.
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

Re: Статусы и rbac

Сообщение Chelobaka »

yiiliveext писал(а): 2019.09.30, 15:41
Chelobaka писал(а): 2019.09.30, 15:23 То есть на каждый статус добавлять if? Такой вариант не годится. Каждый раз переписывать класс это не наш метод.
В цикле по списку статусов. Конкретика зависит от того как вы храните статусы.
Статусы хранятся как константы класса. Не понял ход ваших мыслей, возможно пример псевдокода поможет, буду признателен.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Статусы и rbac

Сообщение yiiliveext »

Chelobaka писал(а): 2019.09.30, 21:16
yiiliveext писал(а): 2019.09.30, 15:41
Chelobaka писал(а): 2019.09.30, 15:23 То есть на каждый статус добавлять if? Такой вариант не годится. Каждый раз переписывать класс это не наш метод.
В цикле по списку статусов. Конкретика зависит от того как вы храните статусы.
Статусы хранятся как константы класса. Не понял ход ваших мыслей, возможно пример псевдокода поможет, буду признателен.
На самом деле, при таком раскладе вам все равно надо будет лезть в класс при изменении статусов. У вас же еще наверняка есть методы вроде getStatusName() и getStatusList(). Но не суть, вернемся к проблеме. Допустим у вас есть метод getBaseStatusList(), который возвращает массив наименований статусов ['New', 'Published', 'Approved', 'Canceled']. Тогда код будет выглядеть примерно так

Код: Выделить всё

$statuses = [];
$postStatuses = getBaseStatusList();
foreach ($postStatuses as $postStatus) {
    if (\Yii::$app->user->can('setPostStatus' . $postStatus) {
        $statuses[] = $postStatus;
    }
}
Соответственно создаем разрешения setPostStatusNew, setPoststatusCanceled, setPostStatusPublished, setPostStatusApproved.
Ну и назначаем ролям в соответствии с иерархией. При изменении/добавлении ролей/статусов просто добавляем/назначаем/отзываем соответствующие разрешения.
Аватара пользователя
Chelobaka
Сообщения: 214
Зарегистрирован: 2018.06.01, 09:54

Re: Статусы и rbac

Сообщение Chelobaka »

насколько я понял что то хранить в константах вообще не вариант.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Статусы и rbac

Сообщение yiiliveext »

Chelobaka писал(а): 2019.10.01, 17:46 насколько я понял что то хранить в константах вообще не вариант.
Почему, если список статусов статический или условно-статический, то это отличное решение. Работает быстро, хорошо читается в коде. А вот если динамический, да еще может произвольно редактироваться пользователем, да еще и мультиязычный, то тогда да, лучше хранить извне. Хотя при этом те же базовые статусы можно прописывать константами.
Ответить