python3 使用ldap3來作為django認證后台


首先先使用ldap3測試ldap服務是否正常

我們先要拿到dc的數據,以及連接ldap的密碼,還有搜索的字段(search_filter), 一般來說search_filter 這個是從負責ldap運維的同事獲取的。attributes 這個是獲取哪些字段的數據,猶如mysql 語句的select xx,xxx , 如果吧attributes設置為ALL_ATTRIBUTES,那么就是獲取所有字段數據。

search_base='ou=xx,dc=xxx,dc=com'  # ldap運維同事提供
ldaphost = ("ldap://192.168.2.1:389")
password="11111"    # 這個是管理員的密碼
search_filter="(objectclass=*)"  

from ldap3 import Server, Connection, ALL, SUBTREE, ServerPool,ALL_ATTRIBUTES
s = Server(ldaphost)
conn = Connection(s,password=password)  
conn.open()
conn.bind()
True  # 執行完bind方法后,返回true說明正確,如果是false的話,需要檢查你Connection參數是否正確
res = conn.search(search_base=search_base,search_filter=search_filter,search_scope=SUBTREE,attributes = ALL_ATTRIBUTES)    # 如果res不是false說明search方法執行成功啦。否則檢查傳入的參數是否正確

如果res返回的是非false,而是一堆ldap數據,那么就說明ldap連接是正常的,那么下面開始使用ldap3聯合django做認證吧

如果上述步驟沒有錯誤的話,那么請走下面這一步

>>> user="cn=oliaojiaf,ou=People,dc=xxx,dc=com,"  # 錯誤寫法
>>> user='cn=oliaojiaf,dc=xxx,dc=com,ou=People,'  # 錯誤寫法
>>> user='cn=oliaojiaf,ou=People,dc=xxx,dc=com' #正確的寫法
>>> c = ldap3.Connection(ldap3.Server("ldap://192.168.2.1:389",get_info=ldap3.NONE,allowed_referral_hosts=[("*", True)],),user=user,password="ljf,xxx",auto_bind=ldap3.AUTO_BIND_NO_TLS,raise_exceptions=True,)
>>> c.open()
>>> c.bind()
True

如果上面也是沒有問題的話,那么就可以配置django+ldap認證了

python3 django ldap認證

咱們使用django-python3-ldap,所以按照安裝配置啟動三步走的方法來。
1.安裝django-python3-ldap模塊

pip install django-python3-ldap

2.配置
django-python3-ldap 模塊 配置方法可以看下官網,官網

AUTHENTICATION_BACKENDS = (
    "django_python3_ldap.auth.LDAPBackend",  #配置為先使用LDAP認證,如通過認證則不再使用后面的認證方式
    #'django.contrib.auth.backends.ModelBackend',
)
LDAP_AUTH_URL = 'ldap://192.168.2.1:389'
LDAP_AUTH_USE_TLS = False
LDAP_AUTH_SEARCH_BASE = 'ou=People,dc=xxx,dc=com'
LDAP_AUTH_OBJECT_CLASS = "inetOrgPerson"
LDAP_AUTH_USER_FIELDS  = {
    "username": "sn",
    "last_name": "sn",
    "first_name": "sn",
    "email": "mail"
}
LDAP_AUTH_CLEAN_USER_DATA = "django_python3_ldap.utils.clean_user_data"
LDAP_AUTH_SYNC_USER_RELATIONS = "django_python3_ldap.utils.sync_user_relations"
LDAP_AUTH_FORMAT_SEARCH_FILTERS = "django_python3_ldap.utils.format_search_filters"
LDAP_AUTH_FORMAT_USERNAME = "django_python3_ldap.utils.format_username_openldap"

3.修改django_python3_ldap.ldap的代碼。
這一步我自己反復測試,發現這個包發給ldap-server的數據格式不對,導致ldap-server返回的就是invalidCredentials,所以我們需要修改它的代碼,使其符合ldap-server要求的數據格式,這個怎么修改就看自己的需求了,沒有標准答案。
修改的代碼相對路徑是 安裝django_python3_ldap的lib路徑/django_python3_ldap/ldap ,例如我的是在 /usr/local/python356/lib/python3.5/site-packages/django_python3_ldap/ldap.py ,在 connection 的方法里面 ,在148行開始

username = username.replace("sn","cn")  # 自己添加的代碼

然后在183行注釋掉源代碼,添加自己的代碼

try:
    # c.rebind(
    #     user=format_username({User.USERNAME_FIELD: settings.LDAP_AUTH_CONNECTION_USERNAME}),
    #     password=settings.LDAP_AUTH_CONNECTION_PASSWORD,
    # )
    c.open()  # 自己添加的代碼
    if not c.bind():  #bind 為false,說明認證失敗,需要拋出異常
        raise LDAPException # 自己添加的代碼,bind返回true的話,說明用戶信息認證成功
except LDAPException as ex:

之所以需要注釋掉上面的代碼,是因為rebind是借助已有的連接再次認證下,這次認證的是我們在settings配置的用戶名密碼,由於我司運維同時給的ldap連接信息里沒有CONNECTION_USERNAME,所以總是認證通過不了,所以我這里就需要注釋了。

然后重啟djanog,發現就能認證成功了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM