@vism

Как правльно организовать RBAC в данной ситуации?

Используется стандартный RBAC
Есть таблица ролей, пермишенов. Пермишены могут быть вложенные(древовидные)
Вводные данные
Стандартный компонент с отображением, редактированием.
Нужно добавить новый пермишен, для определенной роли с возможностью редактировать только 2 поля из более чем 40-ка (manufacturer_order__edit_2_fields)
вот условно дерево пермишенов:
$permissions = [
    'manufacturer_order',
    'manufacturer_order__view',
    'manufacturer_order__edit',
    'manufacturer_order__edit_2_fields',
];


Насколько я знаю, основное правило организации доступа - все запрещено, то что не разрешено.
Поэтому в данные момент существуют проверки на доступ к странице и редактированию по пермишенам view и edit.
Проблема
Условно сейчас для проверки редактирования и отображения полей нужно делать делать проверку для каждого из 40 полей $user->can('manufacturer_order__edit') а для этих двух полей $user->can('manufacturer_order__edit_2_fields')
Тоесть если до этого в коде практически не было проверок, теперь их станет 42 штуки притом их надо сделать как на клиенте(для отображение) так и на сервере для проверки данных
Если в дальнейшем добавятся еще пользователи, которые могут редактировать другие поля - придется добавлять еще проверки и код превратится в
$user->can('manufacturer_order__edit') && $user->can('manufacturer_order__edit_2_fields') && $user->can('manufacturer_order__edit_5_fields')  && $user->can('manufacturer_order__edit_order_fields')


Мне кажется я что-то делаю не так...

Если есть, буду рад ссылкам на статьи или видео с качественным материалом по теме.

UPDATE
это не YII и вопрос не о том как сделать, а как правильно организовать структуру.
Как избежать в отображении десятки проверок, т.к. дополнение и поддержка такого кода будет не приятной, при появлении новых пермишенов
  • Вопрос задан
  • 172 просмотра
Пригласить эксперта
Ответы на вопрос 2
@BorisKorobkov Куратор тега PHP
Web developer
Права:
$permissions = [
    'manufacturer_order_add',
    'manufacturer_order_view',
    'manufacturer_order_edit',
    'manufacturer_order_drop',
];

К каждому надо добавить Rule, который будет проверять права (например, проверить статус заказа и что его автор - текущий юзер).

Проверка:
$user->can('manufacturer_order_edit', ['order' => $order])


Подробнее см. www.yiiframework.com/doc-2.0/guide-security-author...
Ответ написан
@grinat
Да хоть 3002, эт такое слабое воздействие на быстродействие оказывает, что забей. Лучше подумай о том как добавлять новые поля будешь, например массив полей для которых такая проверка доступна, типа:
const FIELDS = ['field1','filed2'];
foreach(FIELDS as $field){
      if(!$user->can('manufacturer_order__edit_field_'.$field){
           throw new Error('ffdsf');
      }
}

Чтобы ты на клиенте и сервере только в одном месте добавлял новое поле, затем в permission включал разрешение, и вуаля, все работает.
Ответ написан
Ваш ответ на вопрос

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

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