Несколько уровней авторизации, не только на основе ролей

Наше приложение использует несколько способов авторизации доступа к данному ресурсу. Хотя это работает, это грязно и... ну, это не кажется правильным.

1) Авторизация на основе ролей

У нас есть четко определенные роли, где каждая роль имеет доступ к набору ресурсов, а разные роли могут получать доступ к одним и тем же ресурсам.

Ресурсы на данный момент представляют собой просто действия MVC, отображенные в таблице базы данных как module, controllerи action.

Кажется, это нормально, но каждый раз, когда мне нужно добавить новый контроллер/действие, я должен сопоставить этот ресурс с таблицей базы данных.

2) Авторизация на основе пользователей

Помимо авторизации на основе ролей, пользователи могут иметь больший или меньший доступ к подмножеству ресурсов другой роли. Напр.:

РольA: ресурсы a, b, c, d
РольB: ресурсы x, y, z
RoleC: ресурсы 1, 2, 3
User1 : имеет роль A , но нуждается в доступе к ресурсу y
User2 : имеет роль B и роль C , но не имеет доступа к ресурсу z

Это реализовано в виде таблицы user_resourcesс записями для дополнительных ресурсов, к которым у пользователя есть доступ или которые запрещены (обозначаются флагом).

Я мог бы создать разные роли с индивидуальным доступом, рассматривая роли как группу разрешений, но это привело бы к взрывному росту количества ролей.

3) Авторизация состояния модели

Если этого недостаточно, некоторые действия могут выполняться только тогда, когда модель находится в определенном состоянии (каждая модель знает, когда что-то можно сделать). Например:заказ может быть отредактирован только в том случае, если пользователь имеет доступ к ресурсу edit(через шаги №1 или №2) и объект Заказможет быть отредактированы.

Еще один пример:пользователь может получить доступ к Заказчику, если у него есть доступ к ресурсу /customer/viewи он владеетэтим Заказчиком (он является контактной информацией для этого клиента).

4) Отображение информации в пользовательском интерфейсе

Роль, группа ролей или отдельные пользователи могут видеть больше или меньше информации о модели в зависимости от ее состояния.

Как упростить процесс авторизации, не теряя гибкости в предоставлении или ограничении доступа к ресурсам?

Есть какой-то шаблон, который мне не хватает, чтобы объединить всю эту авторизацию в одном месте?

13
задан Luiz Damim 18 June 2013 в 12:05
поделиться