11

Ich habe eine App mit Django ausgeführt. Nun möchte ich nur Benutzer, die über einen Openldap-Server authentifiziert werden, um "ihre Sicht" zu sehen (daher brauche ich nur ihre UID nach erfolgreicher Authentifizierung)Wie erreiche ich Authentifizierung mit django-auth-ldap?

Wie kann ich das erreichen?

Ich denke, django-auth-ldap ist der Weg zu gehen, also habe ich den ganzen Tag versucht, um herauszufinden, wo die Authentifizierung tatsächlich stattfindet und wie ich die UID des Benutzers erhalten kann, die eine Ansicht anfordert.

Ich benutzte die documentation for the settings.py, aber ich konnte nicht herausfinden, wie man es "tatsächlich verwendet". Vielleicht kann mir jemand in die richtige Richtung zeigen?

settings.py:

import ldap 

AUTHENTICATION_BACKENDS = (
    'django_auth_ldap.backend.LDAPBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

AUTH_LDAP_SERVER_URI = "ldap://123.60.56.61" 

AUTH_LDAP_BIND_DN = "" 
AUTH_LDAP_BIND_PASSWORD = "" 
AUTH_LDAP_USER_DN_TEMPLATE = "uid=%(user)s,dc=rd,dc=corpintra,dc=net" 

(By the way: ich kann schon ldap-searche mit python-ldap durchführen und die Ergebnisse wie ldapsearch auf der Kommandozeile bekommen, also alles andere funktioniert gut ...)

Was brauche ich in meinen Ansichten?

Danke für Ihre Hilfe!

+0

brauchen Sie eigentlich die ldap UID der Person, oder nur eine eindeutige Kennung für die Person auf dem System? – Thomas

Antwort

6

Hier ist ein Ausschnitt von einer unserer Seiten.

# Django Auth Ldap 
main_dn = 'dc=____,dc=organisation,dc=com' 
groups_dn = 'ou=Groups,'+main_dn 
users_dn = 'ou=Users,'+main_dn 

AUTHENTICATION_BACKENDS = (
    'django_auth_ldap.backend.LDAPBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

AUTH_LDAP_SERVER_URI = "ldap://ldap.organisation.com" 
AUTH_LDAP_BIND_DN = 'cn=___,'+main_dn 
AUTH_LDAP_BIND_PASSWORD = "__________________" 
AUTH_LDAP_USER_SEARCH = LDAPSearch(users_dn, 2, "(uid=%(user)s)") 
AUTH_LDAP_USER_ATTR_MAP = { 
    "first_name": "givenName", 
    "last_name": "sn", 
    "email": "mail" 
} 
AUTH_LDAP_MIRROR_GROUPS = True 
AUTH_LDAP_ALWAYS_UPDATE_USER = True 
AUTH_LDAP_GROUP_TYPE = PosixGroupType() 
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(groups_dn, ldap.SCOPE_SUBTREE, "(objectClass=posixGroup)") 

AUTH_LDAP_USER_FLAGS_BY_GROUP = { 
    "is_staff":   "cn=admins,"+groups_dn, 
    "is_superuser":  "cn=developers,"+groups_dn, 
} 

EDIT:

Da ist die Frage „Was brauche ich, um in meinen Ansichten“, die Antwort ist, dass diese Konfiguration des Benutzers uid als Benutzername Feld auf dem User-Modell zu retten, so in Ihre Ansichten, Sie brauchen

uid = request.user.username 

Hoffentlich bringt das Sie zum Laufen.

+0

Die Frage fragt: "Was brauche ich in meinen Ansichten?" – shailenTJ

+0

@shailenTJ Ich habe meine Antwort – Thomas

+0

Hey @ user982809 aktualisiert, wenn diese Antwort Ihnen geholfen hat, betrachten Sie es bitte als akzeptiert. – Thomas

2

Da django-auth-ldap ein normales Django-Authentifizierungs-Backend ist, sollte request.user auf den authentifizierten Benutzer gesetzt werden (vorausgesetzt, Sie haben die Standard-Middleware installiert — siehe Django-Dokumentation). Bei einer typischen Konfiguration ist request.user.username die UID des Benutzer-DN. Wenn Sie weitere Informationen benötigen, können Sie es von request.user.ldap_user erhalten.

1

Ich benutze nicht django-auth-ldap, ich schreibe mein eigenes LDAP-Authentifizierung Backend.

#define your backend authentification 
AUTHENTICATION_BACKENDS = (
    'netipa.managment.ldapwm.netipaldapdjango.NetIpaLdap', 
    #'django.contrib.auth.backends.ModelBackend ', 
) 

Weitere Informationen über die User-Modell zu erweitern, sehen https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#specifying-a-custom-user-model

#!/usr/bin/env python 
#coding:utf-8 
# Author: peter --<[email protected]> 
# Created: 22/04/12 
from django.conf import settings 
import ldap 
#this is a abstrac class to add some custom fields to the default django User model 
#see https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#specifying-a-custom-user-model, for more informacion 
from netipa.contrib.accesos.models import LdapUsers as User  
from django.contrib.auth.backends import ModelBackend 
#import logging 


class NetIpaLdap(object): 

    supports_inactive_user = False 

    def authenticate(self, username=None, password=None): 
#  logging.basicConfig(format='%(asctime)s %(message)s',filename="/tmp/auth.log",level=logging.DEBUG) 

     if username is None: 
      return None 

     try: 
      # a variable's define in settings 
      ip_server = settings.LDAP_BASES.get('ip') 
      userdn = settings.LDAP_BASES.get('users') 
      ldap.initialize('ldap://%s' % ip_server) 
      lop = ldap.simple_bind_s(
              "uid=%s,%s" % (username, userdn), 
              password 
              ) 
     except ldap.LDAPError, e: 
      print e 
      return None 
     except Exception,e: 
      print e 
      return None 

     try: 
      user = User.objects.get(username=username) 
     except User.DoesNotExist: 
      ldap_at = lop.search(settings.LDAP_BASES.get('users'), 
                fil='uid=%s' % username, 
                types=1, 
                attr=['uidnumber', 'mail']) 
      user = User(username=username, password=password, ldap_id=ldap_at[0][-1].get('uidnumber')[0], 
         ldap_mail=ldap_at[0][-1].get('mail')[0]) 
      user.is_staff = True 
      user.is_superuser = True 
      user.save() 
     return user 

    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

Hier ist meine verlängern Benutzerklasse Modell

from django.db import models 
from django.contrib.auth.models import AbstractUser 

# Create your models here. 

class LdapUsers(AbstractUser): 
    ldap_id = models.IntegerField() 
    ldap_mail = models.EmailField() 
Verwandte Themen