python操作ldap

封装了一个python的ldap常用操作类

首先pip装库

pip install python-ldap

然后开始代码部分

# -*- coding:utf-8 -*-
from __future__ import absolute_import

import binascii
import hashlib
from base64 import b64encode

import ldap
import ldap.modlist as modlist

from common.common import log


class MyLdap():
     
    def __init__(self,ldap_host=None,base_dn=None,user=None,password=None):
        self.base_dn = base_dn
        self.ldap_host = ldap_host
        self.user = user
        self.password = password
        try:
            self.ldapconn = ldap.initialize(ldap_host)
            self.ldapconn.simple_bind(user,password)
        except ldap.LDAPError,e:
            log().error(str(e))
            print e

    @property
    def status(self):
        '''
        验证初始化ldap账号密码,以及ldap地址是否正确
        '''
        ldap_client = ldap.initialize(self.ldap_host)
        try:
            ldap_client.simple_bind_s(self.user, self.password)
            ldap_client.unbind_s()
            return {"status":True}
        except Exception as e:
            log().error(str(e))
            return {"status":False, "msg":"ldap初始化管理员账号密码或ldap地址有误,详情:{0}".format(str(e))}

    def _ldap_search_dn(self,uid=None):
        obj = self.ldapconn
        obj.protocal_version = ldap.VERSION3
        searchScope = ldap.SCOPE_SUBTREE
        retrieveAttributes = None 
        searchFilter = "cn=" + uid
        
        try:
            ldap_result_id = obj.search(self.base_dn, searchScope, searchFilter, retrieveAttributes)
            result_type, result_data = obj.result(ldap_result_id, 0)
            if result_type == ldap.RES_SEARCH_ENTRY:
                return result_data[0][0]
            else:
                return None
        except ldap.LDAPError, e:
            log().error(str(e))

    def ldap_get_user(self,uid=None):
        '''
        获取ldap用户详情,失败返None
        '''
        obj = self.ldapconn
        obj.protocal_version = ldap.VERSION3
        searchScope = ldap.SCOPE_SUBTREE
        retrieveAttributes = None 
        searchFilter = "cn=" + uid
        try:
            ldap_result_id = obj.search(self.base_dn, searchScope, searchFilter, retrieveAttributes)
            result_type, result_data = obj.result(ldap_result_id, 0)
            if result_type == ldap.RES_SEARCH_ENTRY:
                username = result_data[0][1]['cn'][0]
                mail = result_data[0][1]['mail'][0]
                displayName = result_data[0][1]['displayName'][0]
                sn = result_data[0][1]['sn'][0]
                result = {'username':username,'mail':mail,'displayName':displayName, 'sn':sn}
                return result
            else:
                return None
        except ldap.LDAPError, e:
            log().error(str(e))
    
    def ldap_get(self,uid=None,passwd=None):
        '''
        验证ldap账号密码,成功返True,失败返False
        '''
        target_cn = self._ldap_search_dn(uid)
        if not target_cn:
            return False   
        try:
            client = ldap.initialize(self.ldap_host)
            client.simple_bind_s(target_cn,passwd)
            client.unbind_s()
            return True
        except ldap.LDAPError,e:
            log().error(str(e))
            return False

    
    def cnupdatepass(self, cn, passwd):
        '''
        更改ldap密码,成功返True,失败返error
        '''
        dn='cn={0},{1}'.format(cn, self.base_dn)
        try:
            result=self.ldapconn.search_s(dn, ldap.SCOPE_SUBTREE, 'cn=%s' % cn)
            oldpass=result[0][1]['userPassword']
            oldwifipass=result[0][1]['sambaNTPassword']
            newpass='{MD5}' + b64encode(hashlib.md5(passwd).digest())
            wifipass=binascii.hexlify(hashlib.new('md4', passwd.encode('utf-16le')).digest())
            old={'userPassword':oldpass,'sambaNTPassword': oldwifipass}
            new={"sambaNTPassword": [wifipass],"userPassword":[newpass]}
            mlist = modlist.modifyModlist(old, new)
            self.ldapconn.modify_s(dn, mlist)
            return {"status":True}
        except ldap.LDAPError as e:
            log().error(str(e))
            return {"status":False, "msg":"ldap更改密码错误,详情: {0}".format(str(e))}

使用时

ldap_client = MyLdap(ldap_url, base_dn, admin, password)

代码注释已经写的很清楚了感觉,不再写详情了,本文做个备忘

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注