के लिए कस्टम प्रमाणीकरण बैकएंड के साथ समस्या मुझे एक कस्टम प्रमाणीकरण बैकएंड के साथ समस्या है जिसमें मैंने एलडीएपी प्रमाणीकरण के माध्यम से एक सक्रिय निर्देशिका के लिए बनाया है।डीजेगो
समस्या यह है कि व्यवस्थापक प्रवेश पृष्ठ से, के बाद यह ठीक से प्रमाणित करता है और डेटाबेस में नए उपयोगकर्ता बनाता है (या 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)
मैं इसकी तलाश कर रहा था, क्योंकि मुझे समान सामान लिखने की आवश्यकता है। इसे पोस्ट करने के लिए धन्यवाद :-) – gruszczy
क्या आपने mod_ldap और RemoteUserMiddleware का उपयोग करने पर विचार किया है? – davidfischer
आपको अपना संपादन एक प्रश्न में रखना चाहिए और इसे उत्तर के रूप में चिह्नित करना चाहिए ताकि यह प्रश्न 'उत्तर' बन जाए। –