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