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. см. этот пост, например
вы можете сделать это в 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