Как я могу использовать repoze.who/repoze.what с SPNEGO?

Я пытаюсь сделать единый вход (SSO) с помощью веб-приложения для интрасети, написанного на Pylons, и я хотел бы использовать repoze.what для авторизации. Я настроил Apache с mod_sspi, и он правильно аутентифицирует пользователя и устанавливает переменную среды REMOTE_USER. Однако я не могу понять, как убедить repoze.who в том, что пользователь действительно аутентифицирован.

Я попытался создать идентификатор, который выглядит следующим образом:

class NtlmIdentifier(object):     
    def identify(self, environ):           
        if environ['AUTH_TYPE'] == 'NTLM':
            return { 'repoze.who.userid': environ['REMOTE_USER'] }

        return None

    def remember(self, environ, identity):
        pass

    def forget(self, environ, identity):
        pass

И зарегистрируем промежуточное ПО позже так:

return setup_auth(app, groups, permissions, identifiers=identifiers, authenticators=[], challengers=[])

Но похоже, что мой идентификатор identify метод никогда не вызывается фреймворком.

Как вы интегрируете SPNEGO/SSPI с repoze.who и repoze.what?

1 ответ

Решение

Когда переменная REMOTE_USER установлена ​​заранее (например, веб-сервером), repoze.who ничего не будет делать, даже не вызовет зарегистрированные плагины.

Что касается repoze.what v1, поскольку он настроен из плагина repoze.who, это означает, что учетные данные repoze.what не будут доступны, и поэтому пользователь всегда будет анонимным; это не будет проблемой в repoze.what 2 (в стадии разработки).

Чтобы все работало так, как вы ожидаете, вы можете сохранить идентификатор, который вы написали, и передать аргумент remote_user_key в setup_auth:

return setup_auth(app, groups, permissions, remote_user_key=None, identifiers=identifiers, authenticators=[], challengers=[])

НТН.

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