2015-02-26 1 views
2

я получил задачу добавления аутентификации HTTP (BasicAuthAuthenticationPolicy) к приложению Pyramid, что уже есть AuthTktAuthenticationPolicy реализованы ...Множественные политики Authhentication в пирамиде

В основном нужно создать RESTful API для аутентификации пользователей (Могли Я использую для этого BasicAuthAuthenticationPolicy?).

Есть ли способ проверить, пользуется ли пользователь веб-интерфейсом или с помощью api - проверить, какую политику аутентификации использовать?

Я не сталкивался с документацией, которая охватывает две разные Политики аутентификации в одном приложении Pyramid (если это возможно).

PS:
я наткнулся серии блога, который начал показывать, как создать RESTful API с каркасом пирамиды ... The Blogger сообщила, что собирается быть 6 статей в sersies, однако мне удалось чтобы найти две из этих статей: Building a RESTful API with Pyramid - Setup и Building a RESTful API with Pyramid - Resource and Traversal. Я/с нетерпением жду его последней статьи: Построение RESTful API с Pyramid - Аутентификация и ACL, но похоже, что он не закончит серию.

Резюмируя мои вопросы:

  1. Могу ли я использовать BasicAuthAuthenticationPolicy для построения RESTful API для аутентификации пользователей?
  2. Есть ли способ проверить, пользуется ли пользователь веб-интерфейсом или с помощью API - проверить, какую политику аутентификации использовать?

Любая помощь будет оценена.

ответ

1

Так что я сделал, я объединил Пирамиды BasicAuthAuthenticationPolicy и CallbackAuthenticationPolicy, и я закончил с this.

Я модифицировал метод callback, чтобы использовать redis сеанс

Чтобы использовать этот класс (HTTPAthentication) вы можете сделать что-то подобное (это пример того, как я реализовал это для моего USECASE):

def _get_userid(details, request): 
    userre = re.compile("""^([a-zA-Z1-9\.]+):([a-zA-Z1-9\.:-]+)$""", re.I) 
    userpass = base64.b64decode(details[1]) 
    res = userre.search(userpass) 
    if res: 
     return res.group()[0] 

def authcheck(username, password, request): 
    user = Users.by_username(username, enabled=True) 
    host = request.registry.settings.get("authentication.host", "127.0.0.1") 
    maxattempts = request.registry.settings.get("authentication.maxattempts",5) 
    base = _get_userid(request.authorization, request) 
    if request.redis.exists("pimssess:%s" % base64.b64encode(request.remote_addr+":"+base)): 
     store = pickle.loads(request.redis.get("pimssess:%s" % base64.b64encode(request.remote_addr+":"+base))) 
     if store.get("auth.attempts").get(request.remote_addr): 
      if store["auth.attempts"][request.remote_addr] >= maxattempts: 
       raise HTTPMethodNotAllowed(body="You have been locked out for 5 minutes") 

    if user and user.agent and not user.is_http_auth: 
     raise HTTPMethodNotAllowed(body="You are not permitted http access") 
    if user and user.agent and user.host != host: 
     raise HTTPMethodNotAllowed(body="Your host is not permitted http access") 
    if user and user.agent and not user.validate_password(password): 
     time.sleep(1.5) 
     raise HTTPForbidden(body="Failed login, Incorrect password") 
    return getGroups(username) 

Функция getGroups извлекает список groups, который прикреплен к пользователю, т.е.['admin', 'reporting']

Я последовал этому примеру: BasicAuthAuthenticationPolicy (прокрутка вниз)

И для веб-интерфейса входа в систему (CallbackAuthentication), вы создаете интерфейс входа в систему, и создать представление для размещения шаблона (проверки пароля и имени пользователя матч и т. д.)

О, я почти забыл ... В вашем проекте __init__.py, когда вы позвоните AuthPolicy, в def main(...). Я сделал:

authentication = AuthPolicy(secret='@#^&*$!DSYUIDSA8321789DS', 
         hashalg='sha512', check=authcheck, debug=True) 
authorization = ACLAuthorizationPolicy() 

config = Configurator(settings=settings, root_factory=RootFactory, 
        authentication_policy=authentication, 
        authorization_policy=authorization) 

Я надеюсь, что это может кому-то помочь.

1

Pyramid не позволяет легко использовать различные политики для разных частей приложения (возможно, что-то для работы с пользовательскими декораторами), но для нескольких политик вы можете посмотреть pyramid_authstack. Я использую его с политиками Session и BasicAuth с той же целью, что и вы.

1

Если у вас нет простого приложения для пирамиды с двумя политиками auth, вы можете иметь два отдельных приложения Pyramid с другой политикой, каждый из которых собран в один стек WSGI. Каждое приложение может импортировать один и тот же код Python, поэтому, по сути, это два файла автозагрузки, использующих одинаковые представления и все.

Если у вас есть разные URL-адреса, для этого вы можете использовать paste.urlmap, и если ваши требования более сложны, вы можете даже написать собственный маршрутизатор (скажем, запросы с определенным HTTP-заголовком направляются в одно приложение и без него на другой)

Смежные вопросы