Autenticazione con LDAP
Usare LDAP per l'autenticazione ad un sito interno permette di configurare utenti e permessi in un solo posto.
L'applicazione che possiamo usare per integrare LDAP nel nostro progetto Django si chiama django-auth-ldap. django-auth-ldap dipende da python-ldap che a sua volta dipende dalle librerie OpenLDAP che dobbiamo installare nel nostro sistema.
In un sistema Debian / Ubuntu possiamo installare tutto quello che ci serve con questo comando:
sudo apt install build-essential python3-dev libldap2-dev libsasl2-dev
Quindi possiamo procedere ad installare i nostri pacchetti:
pip install python-ldap django-auth-ldap
Per usare esclusivamente l'autenticazione ed ereditare completamente i permessi da LDAP dobbiamo
configurare nel nostro settings AUTHENTICATION_BACKENDS
per usare esclusivamente il backend
di autenticazione fornito django-auth-ldap:
AUTHENTICATION_BACKENDS = [
'django_auth_ldap.backend.LDAPBackend',
]
Se invece vogliamo gestire i permessi individualmente usando il supporto di Django dobbiamo
comunque mantenere il backend di autenticazione ModelBackend
:
AUTHENTICATION_BACKENDS = [
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend',
]
Per configurare l'integrazione con il server LDAP per prima cosa bisogna specificare l'indirizzo:
AUTH_LDAP_SERVER_URI = "ldap://ldap.example.com"
Quindi bisogna autenticarsi settando AUTH_LDAP_USER_SEARCH
in questo modo diremo a Django di cercare
gli utenti nella organisational unit (ou) users
sotto il distinguished name example.com
cercando
il valore che useremo come username al login:
import ldap
from django_auth_ldap.config import LDAPSearch
AUTH_LDAP_USER_SEARCH = LDAPSearch(
'ou=users,dc=example,dc=com',
ldap.SCOPE_SUBTREE,
'(uid=%(user)s)',
)
Discorso analogo vale per i gruppi configurabili tramite AUTH_LDAP_GROUP_SEARCH
:
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
'ou=django,ou=groups,dc=example,dc=com',
ldap.SCOPE_SUBTREE,
'(objectClass=groupOfNames)',
)
Trovati gli utenti dobbiamo mapparli con i modelli già presenti in Django tramite
AUTH_LDAP_USER_ATTR_MAP
:
AUTH_LDAP_USER_ATTR_MAP = {
'first_name': 'givenName',
'last_name': 'sn',
'email': 'mail',
}
In questo esempio stiamo mappando tramite AUTH_LDAP_USER_ATTR_MAP
i campi del modello User
first_name
, last_name
ed email
rispettivamente sui campi LDAP givenName
, sn
e mail
.
Infine dobbiamo mappare i gruppi con gli attributi dei nostri utenti tramite
AUTH_LDAP_USER_FLAGS_BY_GROUP
:
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
'is_active': 'cn=active,ou=django,ou=groups,dc=example,dc=com',
'is_staff': 'cn=staff,ou=django,ou=groups,dc=example,dc=com',
'is_superuser': 'cn=superuser,ou=django,ou=groups,dc=example,dc=com',
}
Con questa configurazione stiamo mappando l'oggetto con common name (cn) active
sotto
django.groups
con il flag is_active
, staff
con il flag is_staff
e superuser
con il flag
is_superuser
.
Sono disponibili ovviamente ulteriori configurazioni e si rimanda alla documentazione ufficiale di django-auth-ldap.
Esercizi
Consulta la documentazione sulla gestione dei permessi.