Проблема в Zeta2.
В Zeta2 присутствовал гибкий механизм определения прав доступа на выполнение операций, централизованный с общей системой безопасности на основе токенов. При крайней гибкости данного решения, оно не оправдало себя:
Нужно знать имена контроллеров и действий, или хотя бы уметь определять их по URL, так в адресе http://myserver/myapp/zeta/start.rails - ZETA - имя контроллера, START - имя действия
Из названия контроллера и действий можно делать СПЕЦИАЛЬНЫЕ РОЛИ:
В Zeta2 присутствовал гибкий механизм определения прав доступа на выполнение операций, централизованный с общей системой безопасности на основе токенов. При крайней гибкости данного решения, оно не оправдало себя:
- Было неудобно в разработке, 90% случаев решалось через атрибуты Admin, Public, Role и миновало ACL
- Низкая производительность
- Крайне неудобно для админов, так никто из действующих админов не научился писать правила доступа к веб-коммандам.
- Не востребованным оказался механизм предпроверки параметров - все равно параметры по безопасности потом приходится проверять в коде.
- Много внимания было уделено всяким непроизводительным резольвингам динамических действий и асинхронных методов, хотя на практике не пригодилось
Соответственно в Zeta3 подход пересмотрен.
- Оставлен только механизм на основе ролей и атрибутов контроллера Roles и его упрощенных форм Public, Admin
- Механизм арсширен за счет СПЕЦИАЛЬНЫХ РОЛЕЙ при помощи которых администратор может провести "тюнинг" доступа - это на смену ACL
- Доступ по умолчанию сменен на ОТКРЫТЫЙ, ранее было ЗАКРЫТЫЙ - неудобно при формировании малых приложений и виджетов
Обзор
Для разработчиков
При создании контроллера ему самому и его действиям следует назначить роли, которыми должен обладать пользователь для доступа к ним.
Помним, что по умолчанию контроллер, действие ДОСТУПНЫ, а ADMIN будет иметь доступ независимо от настроек
[Roles("r1,r2")] - элемент доступен администратору, и ролям r1 и r2 (любой из них)
[Admin] == [Roles("ADMIN")]
[Public] == [Roles("DEFAULT")]
- Если и у действия и у контроллера указан атрибут - то используется настройка действия
- Если у контроллера есть атрибут, а у действия нет - используется атрибут контроллера
[Controller]
[Admin]
class controller1 :
[Public]
def action1() :
pass
controller1/action1 - доступен всем
[Controller]
class controller2:
[Admin]
def action1() :
pass
def action2():
pass
controller2/action1 - доступен только админам
controller2/action2 - доступен всем
Для администраторов
Нужно знать имена контроллеров и действий, или хотя бы уметь определять их по URL, так в адресе http://myserver/myapp/zeta/start.rails - ZETA - имя контроллера, START - имя действия
Из названия контроллера и действий можно делать СПЕЦИАЛЬНЫЕ РОЛИ:
- Разрешающая роль уровня действия - допустим есть команда execute, контроллера tasks, доступная только админам, а надо дать постоянный или временный доступ именно к этой команде пользователю domain\user1, в этом случае в файле привязки ролей можно написать map "domain/user1", "ALLOW_TASKS_EXECUTE"
- Разрешающая роль уровня контроллера (группы комманд) - задача аналогичная предыдущей, но роль чуть другая map "domain/user1", "ALLOW_TASKS"
- Запрещающая роль уровня действия - допустим есть контроллер form, имеющий метод addattachment для добавления приложений, form доступен всем членам роли OPERATOR. Вы хотите чтобы пользователь domain/user1 не теряя доступа в целом к операциям формы не имел права добавлять приложения, в этом случае поместите его в роль map "domain/user1", "DENY_FORM_ADDATTACHMENT"
- Запрещающая роль уровня контроллера - та же мотивация, только более широкая область запрета map "domain/user1", "DENY_FORM" - запрет доступа ко всем операциям контроллера FORM
Мне кажется, что в такой конфигурации настроек безопасности в выигрыше все - у программистов простые и понятные правила игры, у админов прямая возможность без лишних знаний и инструментов тонко настраивать доступ, приложение выигрывает в производительности и менее ресурсоемко.
Комментариев нет:
Отправить комментарий