Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

django 1.8: authentification ldap

+3 votes

Quel package pour gérer l'authentification ldap avec django 1.8 et python 3.4 ?
J'ai essayé django-python3-ldap, mais il ne me remonte pas les noms de connexions utilisateurs.

demandé 23-Nov-2015 par mortim3r (124 points)

jete un coup d'oeil par

1 Réponse

+4 votes

Voici une authentification LDAP que nous utilisons dans un projet Django :

# coding: utf-8
import ldap3 as ldap
from django.conf import settings
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
from django.contrib.auth.backends import ModelBackend


# Serveur LDAP
ldap_server = ldap.Server(settings.LDAP_HOST)


class ActiveDirectoryAuthenticationBackend(ModelBackend):
    """
    Authentification via LDAP
    """

    def authenticate(self, username=None, password=None, **kwargs):
        if len(password) == 0:
            return None

        try:
            # Connexion de l'utilisateur dans le LDAP
            login = settings.LDAP_LOGIN.format(username=username)
            ldap_connection = ldap.Connection(ldap_server, user=login, password=password, auto_bind=True)
            with ldap_connection:
                ldap_connection.bind()

                # Récupération des informations de l'utilisateur
                filter = settings.LDAP_FILTER.format(username=username)
                if ldap_connection.search(settings.LDAP_BASE, filter, ldap.SEARCH_SCOPE_WHOLE_SUBTREE, attributes=settings.LDAP_ATTRIBUTES):
                    attributes = ldap_connection.response[0].get('attributes', {})
                    User = get_user_model()
                    try:
                        user = User.objects.get(username=username)
                        user.set_password(password)
                    except User.DoesNotExist:
                        user = User(
                            username=username,
                            password=password,
                            first_name=attributes['givenName'][0],
                            last_name=attributes['sn'][0],
                            email=attributes['mail'][0],
                            is_active=True,
                            is_staff=True,
                        )

                    # Vérification du statut de l'utilisateur
                    user.is_superuser = False
                    group_names = [group.split(',')[0].split('=')[1] for group in attributes['memberOf']]
                    if username in settings.LDAP_ADMIN_USERS or set(group_names) & set(settings.LDAP_ADMIN_GROUPS):
                        user.is_superuser = True
                    user.save()

                    # Récupération des groupes de l'utilisateur
                    non_ldap_groups = list(user.groups.exclude(name__startswith=settings.LDAP_GROUP_PREFIX))
                    user.groups.clear()
                    for group_name in group_names:
                        group, created = Group.objects.get_or_create(name='{}{}'.format(settings.LDAP_GROUP_PREFIX, group_name))
                        user.groups.add(group)
                    user.groups.add(*non_ldap_groups)
                    return user
                return None
        except:
            return None
répondu 24-Nov-2015 par debnet (1,024 points)

Je viens de m'y casser les dents, pas assez de compétences,trop de temps pour le résultat actuellement. J'y reviendrai plus tard.
Merci pour le temps que vous avez passé.

...