2013-11-27 15 views
5

Tôi đang sử dụng django-ldap-auth để xác thực người dùng dựa trên LDAP -Server (ActiveDirectory). Người dùng có thể đăng nhập và các cờ cho mỗi người dùng (ví dụ: is_staff) được đặt chính xác.Nhận các nhóm từ LDAP đến django

Tôi cũng muốn thêm nhóm django cho người dùng django của mình tùy thuộc vào nhóm người dùng ldap. Here're xác lập cá nhân:

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

Chỉ một phần của các thiết lập này làm việc: Đăng nhập hoạt động, một django người dùng được tạo ra, các thuộc tính được lấy từ LDAP (AUTH_LDAP_USER_ATTR_MAP) và những lá cờ được thiết lập (AUTH_LDAP_USER_FLAGS_BY_GROUP) với cùng đường dẫn nhóm như trong AUTH_LDAP_GROUP_SEARCH. Nhưng tìm kiếm nhóm này không không việc vì lỗi này:

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: 

Kể từ khi nhóm đường dẫn là như nhau cho cờ và cho việc tìm kiếm nhóm tôi đã giả định rằng nó sẽ làm việc. Có vấn đề gì khi tìm kiếm các nhóm khi ràng buộc là xác thực người dùng?

Tôi đang thiếu gì?

Trả lời

2

Đây là những gì tôi đã làm để làm cho nó làm việc:

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

và tôi đã thay đổi (objectClass=groupOfNames)-(objectClass=top)

Dường như django_auth_ldap sử dụng người sử dụng ràng buộc để kiểm tra các cờ (is_staff, ...) nhưng không phải để kiểm tra các nhóm. Vì vậy, tôi đã thêm thông tin đăng nhập vào các biến này hiện được sử dụng để tìm kiếm các nhóm.

Tuy nhiên, nó hoạt động!

Các vấn đề liên quan