Простая аутентификация и 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, ...........
Надеюсь, это поможет