2009-07-09 16 views
9

के लिए कस्टम प्रमाणीकरण बैकएंड के साथ समस्या मुझे एक कस्टम प्रमाणीकरण बैकएंड के साथ समस्या है जिसमें मैंने एलडीएपी प्रमाणीकरण के माध्यम से एक सक्रिय निर्देशिका के लिए बनाया है।डीजेगो

समस्या यह है कि व्यवस्थापक प्रवेश पृष्ठ से, के बाद यह ठीक से प्रमाणित करता है और डेटाबेस में नए उपयोगकर्ता बनाता है (या LDAP सर्वर से अपनी जानकारी को अद्यतन करता) है, लेकिन फिर यह दर्शाता है कि मैं विफल रहा है व्यवस्थापक प्रवेश पृष्ठ पर मुझे देता है एक वैध उपयोगकर्ता नाम और पासवर्ड दर्ज करने के लिए।

यह मानते हुए कि यह django डेटाबेस में उपयोगकर्ता को प्रमाणीकृत और बनाता/अद्यतन करता है, मैं गलत क्या कर रहा हूं?

कोड:

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 

संपादित करें: पता चल। जब तक वे सक्रिय नहीं होते हैं तब तक उपयोगकर्ता लॉग इन नहीं कर सकते हैं (भले ही दस्तावेज़ीकरण यह नहीं कहता)। इसलिए, दिए गए कोड में, नया उपयोगकर्ता बनाने वाली रेखा इस तरह दिखनी चाहिए:

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

मैं इसकी तलाश कर रहा था, क्योंकि मुझे समान सामान लिखने की आवश्यकता है। इसे पोस्ट करने के लिए धन्यवाद :-) – gruszczy

+0

क्या आपने mod_ldap और RemoteUserMiddleware का उपयोग करने पर विचार किया है? – davidfischer

+0

आपको अपना संपादन एक प्रश्न में रखना चाहिए और इसे उत्तर के रूप में चिह्नित करना चाहिए ताकि यह प्रश्न 'उत्तर' बन जाए। –

उत्तर

3

पता लगाया गया। जब तक वे सक्रिय नहीं होते हैं तब तक उपयोगकर्ता लॉग इन नहीं कर सकते हैं (भले ही दस्तावेज़ीकरण यह नहीं कहता)। इसलिए, दिए गए कोड में, नया उपयोगकर्ता बनाने वाली रेखा इस तरह दिखनी चाहिए:

user = User(username=username, is_staff = True, is_Active = True, 
       is_superuser = False) 
संबंधित मुद्दे