django使用LDAP验证
1.安裝Python-LDAP(python_ldap-2.4.25-cp27-none-win_amd64.whl)pip install python_ldap-2.4.25-cp27-none-win_amd64.whl
2.安裝django-auth-ldap(django-auth-ldap-1.2.8.tar.gz)(下載:https://pypi.python.org/pypi/django-auth-ldap),Windows下也可以使用 python setup.py install
? ?安裝成功后運行命令,運行成功表示安裝成功
from django_auth_ldap.config import LDAPSearch, LDAPSearchUnion, GroupOfNamesType3.配置settings.py,增加如下:
? ?參考:https://pypi.python.org/pypi/django-auth-ldap/1.2.1說明文檔
# -*- coding: UTF-8 -*-import ldap from django_auth_ldap.config import LDAPSearch #導入LDAP model AUTHENTICATION_BACKENDS = ( 'django_auth_ldap.backend.LDAPBackend', #配置為先使用LDAP認證,如通過認證則不再使用后面的認證方式'django.contrib.auth.backends.ModelBackend', ) AUTH_LDAP_SERVER_URI = 'ldap://192.168.200.20:389' AUTH_LDAP_BIND_DN = 'CN=test01,OU=ServerAdmin,DC=uu,DC=yyy,DC=com' AUTH_LDAP_BIND_PASSWORD = '123456' OU = unicode('OU=中文名,DC=uu,DC=yyy,DC=com', 'utf8') #限制哪個OU中的用戶可以進行AD認證。如果OU中包含有中文字符,則需要這樣寫,否則會出現ascii無法識別的報錯(UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position) # OU0 = 'OU=ServerAdmin,DC=uxin,DC=youxinpai,DC=com' # OU = unicode('OU=優,DC=uxin,DC=youxinpai,DC=com', 'utf8') # OU1 = u'OU=優,DC=uxin,DC=youxinpai,DC=com' # OU2 = u'OU=\u4f18,DC=uxin,DC=youxinpai,DC=com' # OU == OU1 == OU2 #返回True #檢索單個OU AUTH_LDAP_USER_SEARCH = LDAPSearch(OU, ldap.SCOPE_SUBTREE, "(&(objectClass=person)(sAMAccountName=%(user)s))")# 檢索多個OU: # AUTH_LDAP_USER_SEARCH = LDAPSearchUnion( # LDAPSearch("ou=user,ou=ou1,ou=ou,dc=cn,dc=com",ldap.SCOPE_SUBTREE, "(&(objectClass=user)(sAMAccountName=%(user)s))"), # LDAPSearch("ou=user,ou=ou2,ou=ou,dc=cn,dc=com",ldap.SCOPE_SUBTREE, "(&(objectClass=user)(sAMAccountName=%(user)s))"), # ) #將賬號的姓、名、郵件地址保存到django的auth_user表中,在admin后臺可以看到 AUTH_LDAP_USER_ATTR_MAP = { "first_name": "givenName","last_name": "sn","email": "mail" }?同步用戶組信息:
當用戶登錄后,如果用戶屬于某個組,則會將該組同步到auth_group表中,之后在admin后臺可以對該組進行權限設置,之后同屬于該組的用戶在登錄后則具有相應的權限。
當一個用戶不再屬于某個組,該組也不會被自動刪掉,在admin后臺手工刪掉即可。
from django_auth_ldap.config import LDAPSearch, LDAPSearchUnion, GroupOfNamesType AUTH_LDAP_GROUP_TYPE = GroupOfNamesType(name_attr="cn") #返回的組的類型,并用來判斷用戶與組的從屬關系 OUg = unicode('OU=安全組,DC=uu,DC=yyy,DC=com', 'utf8') AUTH_LDAP_GROUP_SEARCH = LDAPSearch(OUg,ldap.SCOPE_SUBTREE, "(objectClass=group)" ) #搜索某個OU下組信息 AUTH_LDAP_MIRROR_GROUPS = True #導入用戶的組信息,在用戶登錄的時候把用戶的域組關系同步過來。每次用戶登錄時,都會把用戶的組關系刪除,重新從ldap中進行同步(解決辦法參考后面) AUTH_LDAP_ALWAYS_UPDATE_USER = True #是否同步LDAP修改?
4.編輯views.py,當用戶通過認證后,還可以使用django自帶的用戶認證、權限設置模塊:
from django.contrib.auth import authenticate,login as auth_login,logout as auth_logout from django.contrib.auth.models import User@csrf_exempt def loginauth(request):user_loggedin='Guest'errors_list=[]if request.method == 'POST':print 'pp: ',request.POST.get('name'),request.POST.get('password')name = request.POST.get('name')password = request.POST.get('password')user = authenticate(username=name, password=password)print 'authuser',userif user is not None:auth_login(request,user)uu=request.useru=User.objects.get(username=uu)return HttpResponseRedirect("../check_dict")context={'errors_list':errors_list,'user_loggedin':user_loggedin}return render(request,'aptest/loginauth.html',context)auth_user表結構:
?
admin后臺顯示:
?
?
解決中文亂碼問題(有問題可以試下):
在安裝django-auth-ldap-1.2.8.tar之前,先在里面的.py中加上'# -*- coding: UTF-8 -*-'
修改C:\Python27\Lib\site-packages\Django-1.8.4-py2.7.egg\django\conf\global_settings.py和修改settings.py,如下:
TIME_ZONE = 'Asia/Shanghai' LANGUAGE_CODE = 'zh-hans'?
========================?========================
LDAP用戶驗證基本原理
每個用戶在LDAP系統中有一個唯一的DN值,例如配置文件中默認的admin用戶在LDAP中的DN值是uid=admin,ou=system,dc=eoncloud,dc=com, 其中eoncloud.com是域名,system是組名,admin是用戶名,有些LDAP用cn而不是uid來生成DN,在這種系統中admin的DN看起來像這樣cn=admin,ou=system,dc=eoncloud,dc=com,無論是uid還是cn或是別的前綴,django-ldap-auth都是用dn來驗證用戶和獲取用戶信息的.
假設用戶輸入的帳號及密碼是: test, password.
django-auth-ldap有2個方式來獲取用戶的DN
基本配置
用戶組配置
如果需要,django-auth-ldap可以從ldap系統獲取用戶的組信息,也可以限定某個組里的用戶訪問,或者阻止某個組里的用戶訪問,無論是使用哪個功能都需要先配置組類型AUTH_LDAP_GROUP_TYPE及AUTH_LDAP_GROUP_SEARCH, 因為LDAP里組的種類非常多,具體信息請查詢相關資料.
AUTH_LDAP_GROUP_TYPE
- 值類型: LDAPGroupType的子類實例.LDAPGroupType有2個初始化參數:member_attr, name_attr.member_attr是組成員的屬性名, name_attr是組名稱的屬性名.
- 作用: AUTH_LDAP_GROUP_SEARCH返回的組的類型,并用來判斷用戶與組的從屬關系
AUTH_LDAP_GROUP_SEARCH
- 值類型: LDAPSearch實例.
- 作用: 用戶組的查詢條件
AUTH_LDAP_REQUIRE_GROUP
- 值類型: 組的DN
- 作用: 只有指定組的用戶可以訪問
AUTH_LDAP_DENY_GROUP指定的
- 值類型: 組的DN
- 作用: 禁止指定組的用戶訪問
AUTH_LDAP_MIRROR_GROUPS
- 值類型: bool值
- 作用: 導入用戶的組信息
?
AUTH_LDAP_MIRROR_GROUPS=True 這個參數是為了在用戶登錄的時候把用戶的域組關系也獲取并記錄下來。不過開啟這個參數會帶來另外一個問題:每次用戶登錄時,都會把用戶的組關系刪除,重新從ldap中進行同步。由于我們的系統中除了域組還有些自定義的組關系,這樣一來自定義組的用戶關系就不能持久保留了。按照我們的需求,其實只希望在用戶第一次登錄的時候同步組關系,以后的登錄并不需要。這個需求可以通過對django-auth-ldap的源碼(backend.py)進行微調來實現。
參考:http://ctripmysqldba.iteye.com/blog/1880109
backend.py源碼:
def _get_or_create_user(self, force_populate=False): ... ...if self.settings.MIRROR_GROUPS: self._mirror_groups() #修改為如下,然后重新安裝django-auth-ldap-1.2.8.tar,重啟WEB重新驗證即可。if self.settings.MIRROR_GROUPS and created: self._mirror_groups()?
轉載于:https://www.cnblogs.com/dreamer-fish/p/5474289.html
總結
以上是生活随笔為你收集整理的django使用LDAP验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode题目:Valid Ana
- 下一篇: IOS之Foundation之探究学习S