Насколько гибка система аутентификации Pyramids? - PullRequest
3 голосов
/ 26 февраля 2012

Я уже не могу работать с фреймворком Pyramid (отличный фреймворк), и я подошел к точке авторизации пользователя.Я хочу воспользоваться ACL, чтобы блокировать пользователей, которые уже вошли в систему, от посещения страницы регистрации.Очевидно, я мог бы сделать это другими способами, но мне было интересно, есть ли способ сделать это с помощью инструментов в пирамиде.

Я знаю, что, добавляя разрешения к представлению, пользователи, которые не соответствуют критериям,показ запрещенного просмотра.В моем случае я просто хочу перенаправить пользователей, которые уже являются участниками, из представлений, которые к ним не относятся (регистрация, вход в систему и т. Д.).

Я пытался __acl__ = [(Deny, Authenticated, 'guest')] безрезультатно, так как он блокирует страницу входа для всех пользователей.

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

1 Ответ

3 голосов
/ 26 февраля 2012

Вы захотите изучить принципы, которые возвращаются вашей политикой аутентификации, чтобы понять, что происходит. Легко сказать, если вы включите pyramid.debug_authorization в вашем файле INI. Политика авторизации сравнивает найденный ACL с принципалами, возвращенными через pyramid.security.effective_principals(request). Если они не совпадают, должно быть ясно, что происходит.

Способ реализации входа в систему на основе форм будет (при условии, что Pyramid 1.3a9 +):

from pyramid.httpexceptions import HTTPSeeOther
from pyramid.security import authenticated_userid
from pyramid.view import forbidden_view_config

@forbidden_view_config()
def forbidden_view(request):
    if authenticated_userid(request):
        # user is already logged in, they are really forbidden
        return request.context # the forbidden 403 response

    url = request.route_url('login', _query={'came_from': request.path})
    return HTTPSeeOther(url)

Это добавит параметр came_from к URL-адресу как request.GET['came_from'] в вашем виде входа в систему. Конечно, если этого нет, вы можете просто перенаправить их на домашний экран после входа в систему.

...