Наше приложение использует несколько способов авторизации доступа к данному ресурсу. Хотя это работает, это грязно и ... ну, это не кажется правильным.
1) Ролевая авторизация
У нас есть четко определенные роли, где каждая роль имеет доступ к набору ресурсов, а разные роли могут обращаться к одним и тем же ресурсам.
На данный момент ресурсами являются просто действия MVC, отображенные в таблице базы данных как module
, controller
и action
.
Кажется, все в порядке, но каждый раз, когда мне нужно добавить новый контроллер / действие, мне нужно сопоставить этот ресурс с таблицей базы данных.
2) Авторизация пользователя
Помимо авторизации на основе ролей, пользователи могут иметь более или менее доступ к подмножеству ресурсов другой роли. Например:.
RoleA : ресурсы a , b , c , d
RoleB : ресурсы x , y , z
RoleC : ресурсы 1 , 2 , 3
Пользователь1 : имеет RoleA , но ему необходим доступ к ресурсу y
Пользователь2 : имеет RoleB и RoleC , но не имеет доступа к ресурсу z
Это реализовано в виде таблицы user_resources
с записями для дополнительных ресурсов, к которым у пользователя есть доступ или в которых ему отказано (обозначено флажком).
Я мог бы создавать разные роли с настраиваемым доступом, рассматривая роли как группу разрешений, но это привело бы к взрыву ролей.
3) Авторизация состояния модели
Если этого недостаточно, некоторые действия могут быть выполнены только тогда, когда модель находится в определенном состоянии (каждая модель знает, когда что-то можно сделать). Например: заказ может быть отредактирован, только если у пользователя есть доступ к ресурсу edit (с помощью шагов # 1 или # 2) и объект Order
можно редактировать.
Пример Anoter: пользователь может получить доступ к Customer
, если у него есть доступ к ресурсу /customer/view
, и он владеет этим клиентом (он является контактной информацией для этого клиента) .
4) Отображение информации в пользовательском интерфейсе
Роль, группа ролей или отдельные пользователи могут видеть более или менее информацию о модели в зависимости от ее состояния.
Как я могу упростить этот процесс авторизации, не теряя при этом гибкости в предоставлении или ограничении доступа к ресурсам?
Есть какой-то шаблон, который мне здесь не хватает, чтобы объединить все эти полномочия в одном месте?