Простая аутентификация и 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 в пирамиде.

2 ответа

Решение

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

Коротко:

  • О том, что вы реализовали в своем валидаторе, уже позаботилась Pyramid с AuthenticationPolicy
  • Начните настраивать SessionAuthenticationPolicy с вашим пользовательским обратным вызовом ( см. код)
  • Однажды это authn установка, у вас будут те 401 ответы и ваши session значение в request.authenticated_userid приписывать. Вы также можете на заказ вещи в request.registry объект.

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

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

Удачи!

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

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)

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

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

Другие вопросы по тегам