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