2009-07-09 20 views
9

Tôi đang gặp sự cố với phần phụ trợ xác thực tùy chỉnh mà tôi đã tạo cho Active Directory thông qua xác thực LDAP.Sự cố với Tùy chỉnh xác thực phụ trợ cho Django

Vấn đề là từ trang đăng nhập quản trị, sau khi xác thực chính xác và tạo người dùng mới trong cơ sở dữ liệu (hoặc cập nhật thông tin của họ từ máy chủ LDAP), nhưng sau đó đưa tôi trở lại trang đăng nhập quản trị. để nhập tên người dùng và mật khẩu hợp lệ.

Xem xét nó xác thực và tạo/cập nhật người dùng trong cơ sở dữ liệu django, tôi đang làm gì sai?

Mã:

import ldap 
import re 
from django.conf import ad_settings 
grps = re.compile(r'CN=(\w+)').findall 

def anyof(short_group_list, adu): 
    all_groups_of_user = set(g for gs in adu.get('memberOf',()) for g in grps(gs)) 
    return any(g for g in short_group_list if g in all_groups_of_user) 

class ActiveDirectoryBackend(ModelBackend): 
    """ 
    This backend utilizes an ActiveDirectory server via LDAP to authenticate 
    users, creating them in Django if they don't already exist. 
    """ 

    def authenticate(self, username=None, password=None): 
     con = None 
     ldap.set_option(ldap.OPT_REFERRALS, 0) 
     try: 
      con = ldap.initialize('ldap://%s:%s' % (ad_settings.AD_DNS_NAME, 
        ad_settings.AD_LDAP_PORT)) 
      con.simple_bind_s(username+"@"+ad_settings.AD_DNS_NAME, password) 
      ADUser = con.search_ext_s(ad_settings.AD_SEARCH_DN, 
             ldap.SCOPE_SUBTREE, 
             "sAMAccountName=%s" % username, 
             ad_settings.AD_SEARCH_FIELDS)[0][1] 
      con.unbind() 
     except ldap.LDAPError: 
      return None 
     # Does user belong to appropriate AD group? 
     if not anyof(ad_settings.PROJECTCODE,ADUser): 
      return None 

     # Does user already exist in Django? 
     try: 
      user = User.objects.get(username=username) 
     except User.DoesNotExist: 
      #create Django user 
      user = User(username=username, is_staff = True, is_superuser = False) 
     #Update User info from AD 
     if ADUser.has_key('givenName'): 
      user.first_name = ADUser.get('givenName')[0] 
     if ADUser.has_key('sn'): 
      user.last_name = ADUser.get('sn')[0] 
     if ADUser.has_key('mail'): 
      user.email = ADUser.get('mail')[0] 

     # Does not store password in Django. 
     user.set_unusable_password() 
     user.save() 
     return user 

EDIT: đặn ra. Người dùng không thể đăng nhập trừ khi họ đang hoạt động (mặc dù tài liệu không nói điều đó). Do đó, trong mã đã cho, dòng tạo người dùng mới sẽ trông giống như:

 user = User(username=username, is_staff = True, is_Active = True, 
        is_superuser = False) 
+0

Tôi đang tìm kiếm điều này, vì tôi cần viết những nội dung tương tự. Cảm ơn bạn đã đăng bài này :-) – gruszczy

+0

Bạn đã cân nhắc sử dụng mod_ldap và RemoteUserMiddleware chưa? – davidfischer

+0

Bạn nên đặt bản chỉnh sửa của mình trong một câu hỏi và đánh dấu nó là câu trả lời để câu hỏi này trở thành 'đã trả lời'. –

Trả lời

3

Đã tìm ra. Người dùng không thể đăng nhập trừ khi họ đang hoạt động (mặc dù tài liệu không nói điều đó). Do đó, trong mã đã cho, dòng tạo người dùng mới sẽ trông giống như:

user = User(username=username, is_staff = True, is_Active = True, 
       is_superuser = False) 
Các vấn đề liên quan