Je rencontre un problème avec un backend d'authentification personnalisé que j'ai créé pour un annuaire Active Directory via l'authentification LDAP. Le problème est que depuis la page de connexion de l'administrateur, après qu'il authentifie correctement et crée le nouvel utilisateur dans la base de données (ou met à jour ses informations du serveur LDAP), mais me renvoie à la page de connexion admin indiquant que j'ai échoué pour entrer un nom d'utilisateur et un mot de passe valides. Considérant qu'il s'authentifie et crée/met à jour l'utilisateur dans la base de données django, qu'est-ce que je fais de mal?Problème avec le backend d'authentification personnalisé pour Django
Le code:
import ldap
import re
from django.conf import ad_settings
grps = re.compile(r'CN=(\w+)').findall
def anyof(short_group_list, adu):
all_groups_of_user = set(g for gs in adu.get('memberOf',()) for g in grps(gs))
return any(g for g in short_group_list if g in all_groups_of_user)
class ActiveDirectoryBackend(ModelBackend):
"""
This backend utilizes an ActiveDirectory server via LDAP to authenticate
users, creating them in Django if they don't already exist.
"""
def authenticate(self, username=None, password=None):
con = None
ldap.set_option(ldap.OPT_REFERRALS, 0)
try:
con = ldap.initialize('ldap://%s:%s' % (ad_settings.AD_DNS_NAME,
ad_settings.AD_LDAP_PORT))
con.simple_bind_s(username+"@"+ad_settings.AD_DNS_NAME, password)
ADUser = con.search_ext_s(ad_settings.AD_SEARCH_DN,
ldap.SCOPE_SUBTREE,
"sAMAccountName=%s" % username,
ad_settings.AD_SEARCH_FIELDS)[0][1]
con.unbind()
except ldap.LDAPError:
return None
# Does user belong to appropriate AD group?
if not anyof(ad_settings.PROJECTCODE,ADUser):
return None
# Does user already exist in Django?
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
#create Django user
user = User(username=username, is_staff = True, is_superuser = False)
#Update User info from AD
if ADUser.has_key('givenName'):
user.first_name = ADUser.get('givenName')[0]
if ADUser.has_key('sn'):
user.last_name = ADUser.get('sn')[0]
if ADUser.has_key('mail'):
user.email = ADUser.get('mail')[0]
# Does not store password in Django.
user.set_unusable_password()
user.save()
return user
EDIT: cernées. Les utilisateurs ne peuvent pas se connecter à moins qu'ils ne soient actifs (même si la documentation ne le dit pas). Par conséquent, dans le code donné, la ligne qui crée le nouvel utilisateur doit ressembler à:
user = User(username=username, is_staff = True, is_Active = True,
is_superuser = False)
Je cherchais cela, parce que j'ai besoin d'écrire des choses similaires. Merci de poster ceci :-) – gruszczy
Avez-vous envisagé d'utiliser mod_ldap et RemoteUserMiddleware? – davidfischer
Vous devriez mettre votre modification dans une question et la marquer comme réponse afin que cette question soit «répondue». –