Как я могу подтвердить пользователя и пароль с помощью Python ldap3 через OpenLDAP?

#python #django #openldap

#python #django #openldap

Вопрос:

Для проекта django я разработал другую страницу входа. Пользователи здесь будут входить в систему через openldap.

Я могу получить доступ к полной информации пользователей с их идентификатором uid, но я не смог найти, как проверить пароль.

Нужно ли мне хэшировать пароль пользователя и сравнивать его с паролем в ldap? Нет ли другого метода? Спасибо

 from ldap3 import Server, Connection, ALL, SUBTREE
from ldap3.core.exceptions import LDAPException, LDAPBindError, LDAPSocketOpenError
from ldap3.utils.conv import escape_filter_chars

ldap_server_uri=f"ldap://xxx:389"
ldap_base = 'dc=xx,dc=xx,dc=xx'

def ldap(uid,password):
    try:     
        ldap_server = Server(ldap_server_uri, get_info=ALL)
        ldap_connection = Connection(ldap_server, user = 'uid=admin,ou=xx,dc=xx,dc=xx',password='adminpassword')
        if ldap_connection.bind() == True:
            if ldap_connection.search(search_base=ldap_base, search_filter=f'(uid={uid})',search_scope = SUBTREE, attributes=['uid']) == True:
                ent = ldap_connection.entries[0]
                entry = {'uid': ent['uid']}
                ldap_connection.unbind()
                return entry
            else:
                return None
    except LDAPSocketOpenError:
        print('Unabled to connect to the LDAP server!')
        return None
  

Ответ №1:

Просто чтобы проверить имя пользователя и пароль, которые я использую:

 import ldap3
from ldap3.core.exceptions import LDAPException


def _ldap_login(username, password):
    try:
        with ldap3.Connection('enter_server', user=username, password=password) as conn:
            print(conn.result["description"]) # "success" if bind is ok
            return True
    except LDAPException:
        print('Unable to connect to LDAP server')
        return False

_ldap_login("enter_username", "enter_password")
  

Ниже приведены 30 примеров кода, показывающих, как использовать ldap3 и руководство: Введение в ldap3.

Комментарии:

1. Подводя итог, по вашему мнению, достаточно проверить, может ли данный пользователь напрямую войти в ldap, правильно? Таким образом, в ldap не может быть пользователя, который не может войти в него?

2. Верно, вы все правильно поняли. Администратор базы данных или кто-то другой, администрирующий LDAP, подробно объяснит вам это. В моих примерах в LDAP были только пользователи с доменом этой компании, даже другие не могут даже получить доступ к странице входа. Теперь у вас может возникнуть ситуация, когда этой проверки недостаточно, то есть когда само приложение имеет несколько ролей. Например, необходимо, чтобы он был из домена компании, но также и чтобы он был в группе, которая может администрировать приложение, в противном случае оно может только считывать данные. Как и в случае со стандартной базой данных — все зависит от назначения приложения.

Ответ №2:

Вы должны аутентифицировать пользователя с полным путем uid={username},dc=xx,dc=xx,dc=xx .

 from ldap3 import ALL, Connection, Server
from ldap3.core.exceptions import LDAPException

username = "bob"
password = "secret"
ldap_base = "dc=xx,dc=xx,dc=xx"

server = Server(
    host="ldaps://xxx",
    port=636,
    use_ssl=True,
    get_info=ALL,
)

try:
    with Connection(
        server=server,
        authentication="SIMPLE",
        user=f"uid={username},{ldap_base}",
        password=password,
        read_only=True,
        ) as connection:
            print(connection.result)  # "success" if bind is ok

except LDAPException as e:
    print(server.info)