2013-11-27 12 views
5

Ich verwende django-ldap-auth, um Benutzer gegen einen LDAP -Server (ActiveDirectory) zu authentifizieren. Die Benutzer können sich anmelden und die Flags pro Benutzer (z. B. is_staff) sind korrekt eingestellt.Gruppen von LDAP zu Django abrufen

Ich möchte auch meine Django-Benutzer Django-Gruppen in Abhängigkeit von der LDAP-Benutzergruppe hinzufügen. Here're meine Einstellungen:

import ldap 
from django_auth_ldap.config import LDAPSearch, GroupOfNamesType, ActiveDirectoryGroupType 

AUTH_LDAP_SERVER_URI = "ldap://XXX" 

AUTH_LDAP_BIND_AS_AUTHENTICATING_USER = True 
AUTH_LDAP_BIND_DN = "" 
AUTH_LDAP_BIND_PASSWORD = "" 

# I somewhere read that this should help, but it didn't: 
#AUTH_LDAP_GLOBAL_OPTIONS = { 
# ldap.OPT_REFERRALS: 0 
#} 

AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=Benutzer,ou=Konten,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX", 
ldap.SCOPE_SUBTREE, "(cn=%(user)s)") 
AUTH_LDAP_USER_DN_TEMPLATE = "CN=%(user)s,OU=Benutzer,OU=Konten,OU=XXX,OU=XXX,DC=XXX,DC=XXX,DC=XXX" 

# Set up the basic group parameters. 
AUTH_LDAP_GROUP_SEARCH = LDAPSearch("OU=AnwenderRollen,OU=Gruppen,OU=XXX,OU=XXX,DC=XXX,DC=XXX,DC=XXX", 
    ldap.SCOPE_SUBTREE, "(objectClass=groupOfNames)" 
) 
AUTH_LDAP_GROUP_TYPE = GroupOfNamesType(name_attr="CN") 
# also tried various possibilities for objectClass and AUTH_LDAP_GROUP_TYPE 
#AUTH_LDAP_GROUP_TYPE = GroupOfNamesType(name_attr="cn") 
#AUTH_LDAP_GROUP_TYPE = ActiveDirectoryGroupType(name_attr="cn") 


# Populate the Django user from the LDAP directory. 
AUTH_LDAP_USER_ATTR_MAP = { 
    "first_name": "givenname", 
    "last_name": "sn", 
    "email": "mail" 
} 

AUTH_LDAP_PROFILE_ATTR_MAP = { 
    #"employee_number": "employeeNumber" 
} 

AUTH_LDAP_USER_FLAGS_BY_GROUP = { 
    #"is_active": "cn=active,ou=django,ou=groups,dc=example,dc=com", 
    "is_staff": "CN=GROUPNAME,OU=AnwenderRollen,OU=Gruppen,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX", 
    "is_superuser": "CN=GROUPNAME,OU=AnwenderRollen,OU=Gruppen,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX" 
} 

AUTH_LDAP_PROFILE_FLAGS_BY_GROUP = { 
    #"is_awesome": "cn=awesome,ou=django,ou=groups,dc=example,dc=com", 
} 

# This is the default, but I like to be explicit. 
AUTH_LDAP_ALWAYS_UPDATE_USER = True 

# Use LDAP group membership to calculate group permissions. 
AUTH_LDAP_FIND_GROUP_PERMS = True 

# Cache group memberships for an hour to minimize LDAP traffic 
AUTH_LDAP_CACHE_GROUPS = True 
AUTH_LDAP_GROUP_CACHE_TIMEOUT = 1 #3600 

# Keep ModelBackend around for per-user permissions and maybe a local 
# superuser. 
AUTHENTICATION_BACKENDS = (
    'django_auth_ldap.backend.LDAPBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

nur Teile dieser Einstellungen funktionieren: Anmeldung funktioniert, ein django-Benutzer erstellt wird, werden die Attribute von LDAP (AUTH_LDAP_USER_ATTR_MAP) genommen und die Flags gesetzt sind (AUTH_LDAP_USER_FLAGS_BY_GROUP) mit dem gleichen Gruppenpfad wie in AUTH_LDAP_GROUP_SEARCH. Aber diese Gruppe Suche funktioniert nicht Arbeit wegen dieses Fehlers:

DEBUG Populating Django user USERNAME 
DEBUG search_s('CN=USERNAME,OU=Benutzer,OU=Konten,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX', 0, '(objectClass=*)') returned 1 objects: cn=USERNAME,ou=benutzer,ou=konten,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX 
DEBUG CN=USERNAME,OU=Benutzer,OU=Konten,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX is a member of cn=GROUPNAME,ou=anwenderrollen,ou=gruppen,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX 
DEBUG CN=USERNAME,OU=Benutzer,OU=Konten,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX is a member of cn=GROUPNAME,ou=anwenderrollen,ou=gruppen,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX 
DEBUG Django user USERNAMEdoes not have a profile to populate 
ERROR search_s('OU=AnwenderRollen,OU=Gruppen,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX', 2, '(&(objectClass=groupOfNames)(member=CN=USERNAME,OU=Benutzer,OU=Konten,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX))') raised OPERATIONS_ERROR({'info': '00000000: LdapErr: DSID-0C090627, comment: In order to perform this operation a successful bind must be completed on the connection., data 0, vece', 'desc': 'Operations error'},) 
DEBUG search_s('OU=AnwenderRollen,OU=Gruppen,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX', 2, '(&(objectClass=groupOfNames)(member=CN=USERNAME,OU=Benutzer,ou=XXX,ou=XXX,dc=XXX,dc=XXX,dc=XXX))') returned 0 objects: 

Da die Gruppe Pfade sind die gleichen für die Flaggen und für die Gruppensuche war ich davon aus, dass es funktionieren sollte. Ist es ein Problem, beim Binden als authentifizierender Benutzer nach Gruppen zu suchen?

Was fehlt mir?

Antwort

2

Hier ist, was ich es funktioniert tat:

AUTH_LDAP_BIND_AS_AUTHENTICATING_USER = True 
AUTH_LDAP_BIND_DN = "existing_user" 
AUTH_LDAP_BIND_PASSWORD = "existing_password" 

und ich änderte (objectClass=groupOfNames)-(objectClass=top)

Es scheint, dass django_auth_ldap den gebundenen Benutzer verwendet für die Flags zu überprüfen (is_staff, ...) aber nicht um die Gruppen zu überprüfen. Also habe ich diesen Variablen Anmeldeinformationen hinzugefügt, die jetzt für die Suche nach Gruppen verwendet werden.

Allerdings funktioniert es!