Flask-логин и LDAP

я разрабатываю webapp с фреймворком flask в качестве бэкэнда, и мне нужно обеспечить аутентификацию.

поскольку это внутреннее приложение, которое будет использоваться в нашем локальном домене, я решил аутентифицировать пользователя с их уже существующими учетными данными домена.

метод, который я использую-это win32security.LogonUser С pywin32 который возвращает дескриптор при успешном входе в систему.

Я попытался понять, как работает flask-login, но @login_manager.user_loader обратный звонок заставляет меня смущенный.

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

мой класс пользователя выглядит так:

class User(flask_login.UserMixin):
    def __init__(self,username):
        self.username = username
        self.id = ??? 

использовать id, и как этот идентификатор может вернуться к этому экземпляру?

3 ответов


Flask-login не зависит или не нуждается в какой-либо конкретной бэкэнд для пользователей. Вы должны представить объект user и вернуть id. см. этот пост, например

flask-login: не могу понять, как это работает


вы можете сделать это в python с модулем LDAP:

LDAP_SERVER = "yourldapserver"
LDAP_PORT = 390033 # your port
import ldap
def login(email, password):
    ld = ldap.open(LDAP_SERVER, port=LDAP_PORT)
    try:
        ld.simple_bind_s(email, password)
    except ldap.INVALID_CREDENTIALS:
        return False
    return True

self.id должен быть уникальной строкой. это может быть один из :

  • cn (уникальный в LDAP)
  • sAMAccountName (уникальный в домене, он похож на логин unix)
  • mail (многозначный, один из них должен/может быть уникальным)
  • ...

просто выберите один, и мудро. Я предпочитаю sAMAcountName для моей собственной работы. Для этого необходимо выполнить LDAPSearch после ldap_bind.

первая привязка без аутентификации (чтобы найти DN) должен быть сделан с прикладным пользователем, чтобы избежать утечки информации (в случае, если вы взломаны).

соединение Ldap-это ресурсы => используйте context manager

with ldap.open(LDAP_SERVER, port=LDAP_PORT) as ld:
    # do the search/bind/search here