Python操作LDAP,對用戶進行認證(驗證用戶名以及密碼)

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(用戶名,密碼))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章