Динамическая пользовательская авторизация в Pyramid - PullRequest
6 голосов
/ 05 июля 2011

Я следую рекомендациям по безопасности, найденным в документации по Pyramid вместе с учебным пособием по вики Добавление авторизации

Теперь мне нужно добавить ограничения для отдельных пользователей, а не для групп.

Скажем, например, что, если какой-либо редактор блога может иметь разрешение на просмотр всех комментариев, только автор сообщения может редактировать само сообщение .

Для первого заданияУ меня в моем Root ACL будет вот так:

__acl__ = [ (Allow, Everyone, 'view'),
            (Allow, Authenticated, 'view_profile'),
            (Allow, 'groups:editor', 'edit_comment')
]

но что за edit_post?

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

Ответы [ 2 ]

8 голосов
/ 06 июля 2011

У вас уже есть «Дерево ресурсов», создав ресурс Root в вашем проекте.Вам просто нужно добавить узел для него posts, который будет возвращать объект Post с конкретным __acl__, который содержит только идентификатор авторизованного пользователя.Затем вы можете использовать свой маршрут edit_posts, используя traverse='/posts/{post_id}', чтобы перебросить дерево ресурсов к объекту Post с __acl__ на нем.

Это не сложно, и это способ получитьПирамида сделает это за вас.

Если вы не хотите использовать аргумент permission, вы можете выполнить авторизацию внутри самого представления, как предложил Кирк.

Также, есливам не нравится этот метод добавления __acl__ свойств и обхода для авторизации, вы можете реализовать свой собственный AuthorizationPolicy, чтобы делать то, что вы хотите, с заданным списком принципалов и разрешением.

Суть системы аутентификации Pyramid в том, что она есть, и это здорово.Пирамида ни в коем случае не требует, чтобы вы ее использовали, а для представлений, которые ее не используют, при работе с ней не происходит никакого влияния на производительность.

4 голосов
/ 05 июля 2011

Возможно, вы делаете это слишком сложно. Во-первых, показывать ссылку на представление edit_post можно только в том случае, если посетителем является автор сообщения. Это решит 99% проблемы, сделав это представление невидимым для людей, которые не должны его видеть. Для остальных 1% - умные пользователи, вручную редактирующие URL для прямого доступа к представлению редактирования, - добавьте что-то вроде этого:

def edit_post(request):
    ...
    if authenticated_userid(request) != author:
        raise pyramid.httpexceptions.HTTPForbidden("You are not this post's author.")
...