Python操作LDAP,對用戶進行認證
1、環境
Python版本: 3.7.1
操作系統:windows 7 x64
第三方包:python-ldap
2、LDAP
LDAP,它是基於X.500標準的輕量級目錄訪問協議,支持TCP/IP
目錄是一個爲查詢,瀏覽和搜索而優化的數據庫,它成樹狀結構組織數據,類似文件目錄。
目錄數據庫和關係數據庫不用,它有優異的讀性能,但寫性能差,並沒有事務處理,回滾等複雜功能,不適於存儲修改頻繁的數據,所以目錄天生是用來查詢。
3、基本模型
(1)目錄樹概念
- 目錄樹:在一個目錄服務系統中,整個目錄信息集都可以表示一個目錄信息樹,樹中的每個節點是一個條目。
- 條目:每個條目就是一條記錄,每個條目有自己的唯一可區別的名稱(DN)
- 對象類:與某個實體類型對應的以中速屬性,對象類是可以繼承的,這樣父類的必須屬性也會被繼承下來。
- 屬性:描述條目的某個方面信息,一個屬性有一個屬性類型和一個或多個屬性值組成,屬性有必須屬性和非必須屬性。
(2)DC、UID、CN、SN、DN、RDN
- dc:域名的部分,其格式是將完整的域名分成幾部分,如域名爲example.com變成dc=example,dc=com(一條記錄的所屬位置)
- uid: 用戶id
- ou:組織單位,組織單位可以包含其他各種對象(包括其他組織單元)
- cn: 公共名稱
- sn: 姓
- dn:一條記錄的位置,唯一
- rdn: 相對辨別名,類似於文件系統中的相對路徑,它是與目錄樹結構無關的部分
4、代碼實現
# 驗證用戶名以及密碼是否正確(單點登錄)
import ldap
AUTH_LDAP_SERVER_URI = "ldap://0.0.0.0:389" # ldap主機
AUTH_LDAP_BIND_DN = "cn=,ou=,dc=,dc=" # 根據自己實際需求填寫
AUTH_LDAP_BIND_PASSWORD = "" # 管理賬戶密碼
SEARCH_BASE = "OU=,DC=,DC="
def ldapAuth(username, password):
try:
# 建立連接
ldapconn = ldap.initialize(AUTH_LDAP_SERVER_URI)
# 綁定管理賬戶,用於用戶的認證
ldapconn.simple_bind_s(AUTH_LDAP_BIND_DN, AUTH_LDAP_BIND_PASSWORD)
searchScope = ldap.SCOPE_SUBTREE # 指定搜索範圍
searchFilter = "(sAMAccountName=%s)" % username # 指定搜索字段
ldap_result = ldapconn.search_s(SEARCH_BASE, searchScope, searchFilter, None) # 返回該用戶的所有信息,類型列表
if ldap_result:
user_dn = ldap_result[0][0] # 獲取用戶的cn,ou,dc
try:
ldapconn.simple_bind_s(user_dn, password) # 對用戶的密碼進行驗證
print("驗證成功")
return True
except ldap.LDAPError as e:
print(e)
return False
else:
return False
except ldap.LDAPError as e:
print(e)
return False
# r = ldapconn.simple_bind_s(ldap_result[0]["distinguishedName"][0].decode("utf-8"), password) # 驗證用戶的賬號和密碼
# print(r)
# if ldap_result:
# print(ldap_result)
# result_data = ldapconn.result(ldap_result, 1) # 獲取需要認證用戶的dn
# print(result_data)
# if len(result_data):
# _, r_b = result_data[0]
# r = ldapconn.simple_bind_s(r_b["distinguishedName"][0].decode("utf-8"), password) # 驗證用戶的賬號和密碼
# print(r)
# else:
# return False
if __name__ == '__main__':
print(ldapAuth(用戶名,密碼))