2017-10-17 25 views
0

Je travaille sur un projet d'intégration de l'authentification LDAP dans une application Django existante. En utilisant ce site et d'autres, j'ai finalement réussi à tout configurer correctement en utilisant le backend django_auth_ldap. Y compris:Python, Django LDAP: détection L'échec de l'authentification a échoué

AUTH_LDAP_REQUIRE_GROUP = "CN=myGroup,CN=groups [...] " utilisateurs Alors que dans le groupe « myGroup » peut se connecter

Tout est configuré correctement maintenant dans le settings.py et dans la vue user_login il y a juste.

... 
user = authenticate(username=username, password=password) 
if user: 
    if user.is_active: 
     login(request, user) 
     return redirect('index') 
    else: 
     message = "Your account is disabled." 
else: 
    message = "Invalid username or password supplied." 
... 

Maintenant, la dernière étape doit être une notification à l'utilisateur pourquoi son login a échoué. maintenant le message d'échec sera toujours: "Nom d'utilisateur ou mot de passe invalide fourni." Cela devrait être:
- Mauvais nom d'utilisateur/mot de passe
- Pas dans le bon groupe

Quelque chose comme:

if user: 
... 
else: 
    if (LDAP auth failed reason == user does not satisfy AUTH_LDAP_REQUIRE_GROUP): 
     message = "You are not in the right user group." 
    else: 
     message = "Invalid username or password supplied." 
... 


Comment puis-je savoir, dans mon user_login voir la raison de LDAP Authentification échouée?


P.S .: dans le journal django_auth_ldap je ne vois « DEBUG Echec de l'authentification pour nom d'utilisateur: l'utilisateur ne satisfait pas AUTH_LDAP_REQUIRE_GROUP »
Mais comment savoir cela dans la vue user_login?

Répondre

0

Bon, pour répondre à ma propre question. Pour l'instant je viens enlevé AUTH_LDAP_REQUIRE_GROUP = "CN=myGroup,CN=groups [...] " de ma config, et ajouté ce qui suit à la views.py:

from django_auth_ldap.backend import populate_user 
def populate_user_callback(sender, **kwargs): 
    global isLdapUser; 
    global isInRightGroup; 

    isLdapUser = True; 
    if "myGroup" in kwargs["ldap_user"].group_names: 
     isInRightGroup = True; 

populate_user.connect(populate_user_callback) 

Et dans le user_login:

isLdapUser = False; 
    isInRightGroup = False; 

    user = authenticate(username=username, password=password) 

    if (isLdapUser and not isInRightGroup): 
     user = None 
     message = "User is not in the right AD group." 
     ... 
     return ... 

authenticate() appelle la fonction populate_user_callback() si le backend ldap est utilisé. Donc, je vérifie juste pour le groupe correct moi-même. Il y a probablement une solution de nettoyage/meilleure réponse pour cela, mais cela fonctionne pour le moment.