2013-11-27 21 views
5

Sto utilizzando django-ldap-auth per autenticare gli utenti con un LDAP -Server (ActiveDirectory). Gli utenti sono in grado di accedere e i flag per utente (ad esempio is_staff) sono impostati correttamente.Come ottenere gruppi da LDAP a django

Desidero anche aggiungere gruppi di django ai miei utenti di django a seconda del gruppo di utenti di ldap. Here're le mie impostazioni:

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', 
) 

Solo parti di queste impostazioni funzionano: Accesso funziona, viene creato un django-utente, gli attributi sono tratte da LDAP (AUTH_LDAP_USER_ATTR_MAP) e vengono impostate le bandiere (AUTH_LDAP_USER_FLAGS_BY_GROUP) con lo stesso percorso di gruppo come in AUTH_LDAP_GROUP_SEARCH. Ma questa ricerca gruppo non non lavoro a causa di questo errore:

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: 

poiché il gruppo-percorsi sono gli stessi per le bandiere e per la ricerca del gruppo mi è stato presupposto che dovrebbe funzionare. È un problema cercare i gruppi durante l'associazione come utente autenticatore?

Cosa mi manca?

risposta

2

Ecco che cosa ho fatto per farlo funzionare:

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

e ho cambiato (objectClass=groupOfNames)-(objectClass=top)

Sembra che django_auth_ldap utilizza l'utente legato per verificare le bandiere (is_staff, ...) ma non per controllare i gruppi. Così ho aggiunto le credenziali a queste variabili che ora vengono usate per cercare gruppi.

Tuttavia, funziona!

Problemi correlati