Привет.
Начну с простого примера, чтобы проще было сформулировать вопросы.
Итак, есть сущность
Контракт с полями:
- number
- date
- manager_id
manager_id - привязка к пользователю, за которым закреплен контракт.
Есть роли (группы) пользователей:
- Директор (видит все контракты)
- Менеджер (видит только "свои" контракты)
Очевидно, что при выборке контрактов необходимо получить роль текущего пользователя, и в зависимости от нее выбрать нужные контракты. Однако в различных best practicies говорится о том, что в коде нужно работать с разрешениями, а не с ролями пользователя. В таком случае можно завести следующие разрешения:
- доступ ко всем контрактам (назначить это разрешение для роли "Директор")
- доступ к "своим" контрактам (назначить это разрешение для роли "Менеджер")
Тогда кажется, что все неплохо и в коде будет что-то типа:
if (User::hasPermission('all_contracts')) {
Contract::all();
} elseif (User::hasPermission('own_contracts')) {
Contract::getByManager(User::getId());
}
Предположим теперь, что у нас в системе появляется некий "Региональный директор", который должен видеть контракты в своем регионе. Видимо, в этом случае к контракту будет добавлено поле
- region_id
по которому будет осуществляться выборка для регионального директора.
Как в таком случае изменится код?
if (User::hasPermission('all_contracts')) {
Contract::all();
} elseif (User::hasPermission('own_contracts')) {
if (User::hasRole('manager')) {
Contract::getByManager($managerId);
} elseif (User::hasRole('region_manager')) {
Contract::getByRegion(User::getRegionId());
}
}
Так или иначе в коде появляется проверка ролей пользователя.
Правильно ли это? Если нет - то как реализуете вы?
И вопрос вдогонку, уже конкретно о Laravel: правильно ли я понимаю, что данное разруливание прав необходимо выносить в сервис-провайдер? Вроде бы контроллеры/модели/репозитории для таких вещей не предназначены.