web-dev-qa-db-fra.com

Comprendre l'authentification Django-LDAP

Je suis nouveau sur Django et j'ai été chargé d'implémenter un système d'authentification utilisateur avec LDAP comme backend. Je suppose que la documentation suppose que le développeur final en a assez expérience en Django pour pouvoir comprendre et implémenter un tel système. C'est là que je n'arrive pas à comprendre comment implémenter une simple Django application avec authentification LDAP) Voici ce que j'ai compris jusqu'à présent:

Publier uniquement les modifications dans un fichier:

settings.py
....
import ldap
from Django_auth_ldap.config import LDAPSearch

AUTH_LDAP_SERVER_URI = "ldap://<my url>" 
AUTHENTICATION_BACKENDS = ('Django_auth_ldap.backend.LDAPBackend')

AUTH_LDAP_CONNECTION_OPTIONS = { 
    ldap.OPT_REFERRALS: 0
}

MIDDLEWARE_CLASSES = ( 
     ....
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    ...
)

INSTALLED_APPS = ( 
    'Django.contrib.auth',
    'Django.contrib.contenttypes',
    'Django.contrib.sessions',
    ....
)

auth.html

<html>
    <head>
        <title>Login</title>
    </head>
    <body>
        {{state}}
        <form action="" method="post"> {% csrf_token %}
            Email address: <input type="text" name="email" value="{{ email }}" />
            Password: <input type="password" name="password" value="" />
            <input type="submit" value="Log in" />
        </form>
    </body>
</html>

models.py:

??

views.py:

from Django.shortcuts import render_to_response
from Django.contrib.auth import authenticate, login
from Django.template import RequestContext


def login_user(request):

    username = password = ""
    state = ""

    if request.POST:
        username = request.POST.get('username')
        password = request.POST.get('password')

        print username, password

        user = authenticate(username=username, password=password)
        if user is not None:
            login(request, user)
            state = "Valid account"
        else:
            state = "Inactive account"
    return render_to_response('auth_user/auth.html', RequestContext(request, {'state': state, 'username': username}))

Qu'est-ce que je ne peux pas comprendre?

1> Je suis sûr que je devrais implémenter une fonction dans views.py pour obtenir les valeurs POST pour email et password et les valider, par exemple: [SO] . La documentation spécifie d'implémenter une recherche/liaison ou une liaison directe. Pourquoi? Si la views.py contiendrait le véritable code d'authentification, que fait le code spécifié dans la documentation?

2> Si le views.py effectuerait l'authentification réelle, alors pourquoi avons-nous besoin de la variable spécifiée dans la documentation?

3> L'auteur a fait un excellent travail avec la bibliothèque, mais la documentation ne fournit pas un exemple simple de barebones sur la façon de mettre en œuvre l'ensemble du système d'authentification avec LDAP. Quelqu'un peut-il indiquer une telle ressource, si elle existe? Il n'est pas facile de comprendre les fichiers qui doivent être ajoutés/modifiés pour implémenter un tel système.

29
name_masked

Cette page peut avoir ce que vous cherchez: https://pypi.python.org/pypi/Django-auth-ldap concernant le backend LDAP. Vous avez de la chance qu'il en existe un, vous n'avez donc pas à coder vous-même un backend d'authentification :-)

Fondamentalement, Django.contrib.auth.models a déjà un objet User qui contient tout ce dont vous avez besoin sur l'utilisateur. Vous n'avez donc pas besoin de créer un nouveau models.py.

Il vous suffit de vous authentifier dans votre views.py, dans une fonction de connexion, en utilisant

from Django.contrib.auth import authenticate, login
user = authenticate(username=request.REQUEST.get('email'), password=request.REQUEST.get('password'))
# handle error cases, inactive users, ...
login(request, user)

Si l'utilisateur est Aucun, l'authentification a échoué. Sinon, vous pouvez explorer cet objet pour voir ce que le backend a tiré pour vous.

Ensuite, vous pouvez choisir de créer un autre modèle avec l'utilisateur en tant que clé étrangère si vous souhaitez conserver les préférences liées à cet utilisateur pour cette application mais ne faisant pas partie du LDAP.

Dans ce cas, vous aurez besoin de:

Models.py

La définition des données importantes pour vous en fonction de votre application. Vous allez extraire les données utilisateur du LDAP et remplir ce modèle avec lui et d'autres préférences liées à l'utilisateur:

from Django.contrib.auth.models import User    

class Profile(models.Model):
    """User profile.  Contains some basic configurable settings"""
    user = models.ForeignKey(User, unique=True)
    phone_number = models.CharField(max_length=256, blank=True, default='')
    ...

Views.py

  • dans la fonction de connexion, si request.method == 'POST', puis get_or_create le profil utilisateur en utilisant l'utilisateur que vous venez d'obtenir d'authentifier.

    profile, profile_is_new = Profile.objects.get_or_create(user=user)
    
29
Ptah

Les documents Django-auth-ldap sont en effet écrits pour les développeurs qui connaissent Django. Aussi LDAP. Si vous partez de zéro, je recommanderais de le faire une étape à la fois:

  1. Le tutoriel Django
  2. authentification Django
  3. Une sorte de tutoriel LDAP, si vous n'êtes pas déjà familier.
  4. Django-auth-ldap
6
psagers