В настоящее время я использую простую процедуру проверки подлинности SQLAlchemy + URL Dispatch (без использования метода авторизации пирамиды), то есть я просто поднимаю HTTPForbidden, когда пользователь не может что-то сделать (эти проверки происходят в разных местах, в том числе при проверке деформации и т. д.).авторизация пирамиды - индивидуальные представления
С новым проектом я хочу попробовать использовать метод авторизации пирамиды, но я нажимаю жесткую стену с точки зрения настройки видов.
Текущее понимание
- Каждый вид (я использую
@view_config
декоратор) может иметь одну строку разрешения. Обычно «читать» и «писать», но может быть любой строкой. Multiple permissions in view_config decorator? - Каждый пользователь может иметь множество принципалов (почерпнутые из SQLAlchemy + URL Dispatch tutorial)
- Связь между принципалом и строка разрешения authorization policy, что означает несколько принципалов может иметь ту же строку разрешения.
Это кажется довольно обтекаемый для the example сообщений в блоге и т.д., где определение __acl__
позволяет спецификации, которые могут получить доступ к определенной странице, и где «каждый может читать, но только эти две роли могут редактировать» имеет смысл.
Узкое
Пункт 1. где каждый вид должен иметь один и только один разрешение строки кажется неоптимальным. link in point 1 является примером, где должна использоваться строка разрешений «readwrite».
В частности, я хотел бы создать политику, в которой пользователям A и B разрешено просматривать определенное представление (список элементов), но пользователь A может редактировать определенные поля на этой странице, в то время как пользователь B может редактировать некоторые другие поля (возможно, перекрывающиеся). Методы, которые могут быть достигнуты в настоящее время: -
- В моей форме проверки (или запроса.POST) я могу check if a user has permissions.
- В моей генерации формы (я использую деформу) Я могу запускать те же проверки, чтобы отмечать определенные поля как доступные только для чтения.
- В моем шаблоне я могу выполнить ту же проверку, чтобы скрыть/показать поля по мере необходимости.
- Каждый отправляет разные URL-адреса, с тонкими видами, которые определяют конкретную строку разрешений и перенаправляют обратно на исходную страницу для POST (только если авторизация просмотра передана).
Первые 3, кажется довольно неуклюжим, в том, что они именно то, что я делал раньше (только теперь мне нужно использовать has_permission
вместо проверки request.user.role или request.user.id вручную).
Четвертый кажется более «правильным» при использовании аутентификации/авторизации пирамиды, но для этой цели требуется целая куча новых URL-адресов, маршрутов и представлений. Существенно большая сложность, которую я не могу просто отключить в security.py
, как я надеялся, используя метод авторизации пирамиды.
Резюме
ли я что-то пропустил в плане того, как разрешение может сделать свою жизнь проще, потому что все выше, кажется, добавить накладные расходы и сложность кода по сравнению с моим ручных проверок (которые я хочу, чтобы избавиться от, потому что делает аутентификацию распределенной по всему моему коду, в шаблонах, в представлениях и даже иногда в модели).
Во-первых, спасибо за ваш быстрый ответ! Ваше первое предложение очень похоже на мою точку 1. на проверку прав проверки вручную, в то время как второе предложение требует AJAX (которого я действительно не хочу вдаваться в этот простой проект), и действительно было бы дрянным для реализации для деформирования. –
Ну, в основном на уровне Pyramid ваш вопрос сводится к тому, что «у меня есть два действия, требующие разных разрешений, и у меня есть одна функция просмотра для их обработки» - ответ на это «либо разрешает проверку вручную внутри функции представления, либо имеет два отдельных функции просмотра ". Я не вижу, как возможность назначить более одного разрешения функции просмотра поможет здесь или в какой ситуации это будет даже иметь смысл. – Sergey
Re. делать проверки вручную - я не работал с Deform в последнее время, но я уверен, что можно написать некоторую общую функцию для проверки разрешений на каждое поле схемы Colander на выходе (и сделать виджет только для чтения) и на путь в (игнорировать изменения или выбросить исключение). – Sergey