Django LDAP authentication without store login informations

Hello

I´m novice and I have problem with my django project. I need active directory autentification but I don´t want to store my login informations in database. That´s why I try to use my own ldap backend. When I run my python test file I see all my AD users. Here is code:

import ldap3
import sys

LDAP_SERVER = "ldap://aaaaa:389"  # Adresa vašeho LDAP serveru
LDAP_SEARCH_BASE = "dc=pm,dc=cz"  # Širší základna pro vyhledávání
LDAP_USERNAME = "xxxxx"  # Uživatel pro připojení k LDAP (změňte na testovací účet)
LDAP_PASSWORD = "yyyyy"  # Heslo pro připojení k LDAP (změňte na testovací účet)

def main():
\# Vytvoření LDAP server objektu
server = ldap3.Server(LDAP_SERVER)
\# Vytvoření připojení s daným uživatelským jménem a heslem
conn = ldap3.Connection(server, user=LDAP_USERNAME, password=LDAP_PASSWORD)

    # Pokus o připojení
    if not conn.bind():
        print(f"Failed to connect to the LDAP server. Error: {conn.last_error}")
        sys.exit(1)
    
    # Provedení vyhledávání
    search_filter = '(&(objectClass=user)(objectCategory=person))'
    conn.search(LDAP_SEARCH_BASE, search_filter, attributes=['sAMAccountName', 'givenName', 'sn', 'mail'])
    entries = conn.entries
    if entries:
        print(f"Found {len(entries)} entries:")
        for entry in entries:
            print(entry)
    else:
        print("No entries found")
    
    # Odpojení od serveru
    conn.unbind()

if __name__ == "__main__":
main()

But when I try my django site it still say: Invalid name or password and without error in console.

Here is part of settings.py:

# LDAP nastavení

LDAP_SERVER = "ldap://aaaaa:389"  # Adresa vašeho LDAP serveru
LDAP_SEARCH_BASE = "dc=pm,dc=cz"  # Širší základna pro vyhledávání
# LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN = "pm"  # Doména pro formátování uživatelských jmen

LDAP_AUTH_CONNECTION_USERNAME = "xxxxx"  # Uživatel pro připojení k LDAP
LDAP_AUTH_CONNECTION_PASSWORD = "yyyyy"  # Heslo pro připojení k LDAP

# Přihlašovací a přesměrovací URL

LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/'

# Logování pro ladění

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django': {
'handlers': \['console'\],
'level': 'DEBUG',
},
'myapp': {
'handlers': \['console'\],
'level': 'DEBUG',
},
},
}

# Middleware

MIDDLEWARE = \[
\# ...
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
\# ...
\]

LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django_python3_ldap': {
'handlers': \['console'\],
'level': 'DEBUG',
},
},
}

> Blockquote

Here is ldap_backend.py :

import ldap3
from django.contrib.auth.models import User
from django.conf import settings
from django.contrib.auth.backends import BaseBackend
import logging

logger = logging.getLogger(__name__)

class LDAPBackend(BaseBackend):
def authenticate(self, request, username=None, password=None):
\# Nastavení LDAP serveru a připojení
server = ldap3.Server(settings.LDAP_SERVER)
user_dn = f"{settings.LDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN}\\{username}"
conn = ldap3.Connection(server, user=user_dn, password=password)

        # Pokus o připojení (bind)
        if conn.bind():
            logger.info(f"Úspěšné přihlášení uživatele {username}")
            # Zde můžete vytvořit a vrátit objekt User s informacemi z LDAP
            # nebo vrátit prostý řetězec s uživatelským jménem
            return username
        else:
            logger.error(f"LDAP bind failed: {conn.result['description']}")
            return None
    
    def get_user(self, user_id):
        # Tato metoda není potřebná, protože nebudeme pracovat s Django modelem User
        pass

And here is my loging form:


<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
        <h2 class="mt-5">Login</h2>
        {% if form.errors %}
            <div class="alert alert-danger">
                <strong>Login failed!</strong> Please check your username and password and try again.
            </div>
        {% endif %}
        {% if messages %}
            {% for message in messages %}
                <div class="alert alert-{{ message.tags }}">{{ message }}</div>
            {% endfor %}
        {% endif %}
        <form method="post">
            {% csrf_token %}
            <div class="form-group">
                <label for="username">Username:</label>
                <input type="text" class="form-control" id="username" name="username" required>
            </div>
            <div class="form-group">
                <label for="password">Password:</label>
                <input type="password" class="form-control" id="password" name="password" required>
            </div>
            <button type="submit" class="btn btn-primary">Login</button>
        </form>
    </div>
</body>
</html>

Thank you very much for your help :slight_smile: