простая аутентификация и ACL с помощью карниза

У меня есть RESTful API, написанный на пирамиде/карнизе. Он предоставляет API для клиента Ember.

Я следовал руководству по карнизам и у меня есть валидатор valid_token, который я использую во многих представлениях. как методы классов ресурсов.

def valid_token(request):
    header = 'Authorization'
    token = request.headers.get(header)
    if token is None:
        request.errors.add('headers', header, "Missing token")
        request.errors.status = 401
        return
    session = DBSession.query(Session).get(token)
    if not session:
        request.errors.add('headers', header, "invalid token")
        request.errors.status = 401
    request.validated['session'] = session

Теперь я хочу начать выборочно защищать ресурсы. Пирамидный способ, по-видимому, заключается в регистрации аутентификации/авторизации политики. Кажется, что ACLAuthorizationPolicy обеспечивает доступ к хорошему инструментарию ACL в пирамиде. Однако похоже, что для работы пирамиды необходимы как политики аутентификации, так и политики авторизации. Поскольку я аутентифицируюсь с помощью своего валидатора, это меня смущает.

Могу ли я использовать ACL для управления авторизацией во время аутентификации с помощью моего карниза valid_token валидатора? Нужно ли регистрировать политики проверки подлинности или авторизации пирамиды?

Я немного запутался, имея небольшой опыт использования ACL в пирамиде.


person Graeme Stuart    schedule 11.09.2015    source источник


Ответы (2)


Это не простой вопрос :)

Коротко:

Единственная причина сохранить ваш валидатор — это если вы хотите вернуть сообщения invalid token в ответе 401. Но для этого вы можете определить собственное пирамидальное представление 401 (используя @forbidden_view_config)

Получив это, вы можете настроить пользовательскую авторизацию для своих представлений. Вы можете найти очень простой пример в первых версиях Cliquet здесь: код авторизации и посмотреть перм

Удачи!

person leplatrem    schedule 11.09.2015
comment
Итак, ваш совет — избегать использования карнизных валидаторов для аутентификации? - person Graeme Stuart; 26.09.2015
comment
Я работаю над этим. Кажется, мне нужно свернуть свою собственную AuthenticationPolicy, SessionAuthenticationPolicy не кажется подходящей, когда авторизация происходит по каждому запросу. - person Graeme Stuart; 26.09.2015

Вы можете сделать что-то вроде:

from pyramid.authentication import SessionAuthenticationPolicy
from pyramid.authorization import ACLAuthorizationPolicy
from your_module import valid_token 

authn_policy = SessionAuthenticationPolicy(debug=True, callback=valid_token)
authz_policy = ACLAuthorizationPolicy()

config = Configurator(authentication_policy=authn_policy,authorization_policy=authz_policy)

И, конечно же, в конфигурации будут получены другие аргументы, такие как настройки, locale_negociator, ...........

Надеюсь, это поможет

person Palmer    schedule 11.09.2015