標籤:

對ldap實現增刪改查--附demo

因公司需要對ldap進行操作,來管理公司成員,所以看了一下官方文檔,還有資料。以下是整理。

ldap維基百科定義 -- ldap維基百科

輕型目錄存取協定(英文:Lightweight Directory Access Protocol,縮寫:LDAP,/??ld?p/)是一個開放的,中立的,工業標準的應用協議,通過IP協議提供訪問控制和維護分散式信息的目錄信息。

目錄服務在開發內部網和與互聯網程序共享用戶、系統、網路、服務和應用的過程中佔據了重要地位。例如,目錄服務可能提供了組織有序的記錄集合,通常有層級結構,例如公司電子郵件目錄。同理,也可以提供包含了地址和電話號碼的電話簿。

LDAP由互聯網工程任務組(IETF)的文檔RFC定義,使用了描述語言ASN.1定義。最新的版本是版本3,由RFC 4511所定義。例如,一個用語言描述的LDAP的搜索如:「在公司郵件目錄中搜索公司位於那什維爾名字中含有「Jessy」的有郵件地址的所有人。請返回他們的全名,電子郵件,頭銜和簡述。」

LDAP的一個常用用途是單點登錄,用戶可以在多個服務中使用同一個密碼,通常用於公司內部網站的登錄中(這樣他們可以在公司電腦上登入一次,便可以自動在公司內部網上登入)。

LDAP基於X.500標準的子集。因為這個關係,LDAP有時被稱為X.500-lite。

有其它需求的時候可以自己查看一下ldap官方文檔 -- ldap官方文檔

ldap的增刪改查實現

#!/usr/bin/env pythonn# encoding: utf-8nimport sys, ldapnimport ldap.modlist as modlistnimport rennreload(sys) # Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入nsys.setdefaultencoding(utf-8)nnLDAP_HOST = nUSER = nPASSWORD = nLDAP_BASE = nnldap增刪改查實現nclass LDAPTool:n def __init__(self, ldap_host=None, base_dn=None, user=None, password=None):n if not ldap_host:n ldap_host = LDAP_HOSTn if not user:n user = USERn if not password:n password = PASSWORDnn self.base_dn = base_dnn try:n self.ldapconn = ldap.open(ldap_host)n self.ldapconn.simple_bind(user, password)n except Exception as e:n # except ldap.LDAPError as e:n print(e)nn 查找,這裡根據isNeedList欄位來判斷是否返回全部數據n def ldap_search(self, filter="cn", value=None, isNeedList=0):n obj = self.ldapconnn obj.protocal_version = ldap.VERSION3n searchScope = ldap.SCOPE_SUBTREEn # retrieveAttributes = ["cn","uid","title","departmentNumber","mobile","mail","employeeNumber","initials","createTimestamp","modifytimestamp"] # None # None means default by zhoujunn retrieveAttributes = ["*", "createTimestamp"]n # searchFilter = "uid=" + uidn searchFilter = filter + "=" + valuen # print(searchFilter)n try:n if isNeedList:n ldap_result_id = obj.search_s(self.base_dn, searchScope, searchFilter, retrieveAttributes)n return ldap_result_idn else:n ldap_result_id = obj.search(self.base_dn, searchScope, searchFilter, retrieveAttributes)n result_type, result_data = obj.result(ldap_result_id, 0)n if result_type == ldap.RES_SEARCH_ENTRY:n # dn = result[0][0]n return result_data # [0][0]n else:n return Nonen except Exception as e:n # except ldap.LDAPError as e:n # print en return Nonenn def set_base_dn(self, dn):n self.base_dn = dnn n 更新,這裡根據isNeedList欄位來判斷是否返回全部數據n def ladp_modify(self,cn,old,new): n obj = self.ldapconnn obj.protocal_version = ldap.VERSION3n try:n ldif = modlist.modifyModlist(old, new)n obj.modify_s(cn, ldif)n obj.unbind_s()n except ldap.LDAPError, e:n print en 刪除n def ladp_delete(self,cn):n obj = self.ldapconnn obj.protocal_version = ldap.VERSION3nn try:n deleteDN = (.format(cn))n obj.delete_s(deleteDN)n except ldap.LDAPError, e:n print en

查詢例子:

l = LDAPTool(base_dn=LDAP_BASE).ldap_search(filter="", value="")n

filter是過濾條件,根據你實際情況來寫,value如果是『*』,就是返回全部。

修改例子:

假如我們的一條ldap數據如下:

(cn=劉蘩,ou=People,dc=liufan,dc=com, {departmentNumber: [10000], employeeType: [在職], uid: [Doran], title: [爬蟲工程師], userPassword: [xxxxxxxxx], employeeNumber: [10000], initials: [男], mobile: [1310000000], manager: [cn=領導_lingdao,ou=People,dc=liufan,dc=com], createTimestamp: [20170814032037Z], mail: [liufan.dery@gmail.com], givenName: [蘩], cn: [劉蘩_Doran]})

想更改manger欄位

cn = cn=劉蘩,ou=People,dc=liufan,dc=comnold = {manager: [cn=領導_lingdao,ou=People,dc=liufan,dc=com]}nnew = {manager: [cn=劉蘩_Doran,ou=People,dc=liufan,dc=com]}nnl = LDAPTool(base_dn=LDAP_BASE).ldap_modi(filter="", value="")n

l = LDAPTool(base_dn=LDAP_BASE).ladp_modify(cn,old,new)

推薦閱讀:

python與redis的初次碰撞——把玩redis資料庫的一點心得
Python實現爬蟲代理池?
python內置的hash函數對於字元串來說,每次得到的值不一樣?
【譯文】2016年度Analytics Vidhya上最火爆的36篇文章和資源

TAG:Python | LDAP |