Динамическая авторизация на основе пользователя в пирамиде

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

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

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

для первой задачи у меня будет в моем корневом ACL, как это:

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

но что насчетedit_post?

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

2 ответов


возможно, вы делаете это слишком сложным. Во-первых, только показать ссылку 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.")

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

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

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

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

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