ldap调用代码分享,可以参考

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
@Time    : 2019/11/14 5:37 PM
@Author  : NoSong
@File    : LdapBaseApi.py
@Software: PyCharm
# 接口文档: https://ldap3.readthedocs.io/
# https://ldap3.readthedocs.io/tutorial_operations.html#
"""ldap_config = {'host': "192.168.13.133",'port': 389,'base_dn': 'dc=domain,dc=com','user': 'admin','password': 'admin',
}from ldap3 import Server, Connection, SUBTREE, ALL_ATTRIBUTES
from ldap3.core.exceptions import LDAPBindError
from ldap3 import MODIFY_REPLACE
from ldap3.utils.dn import safe_rdn
import sys
reload(sys)
sys.setdefaultencoding('utf8')class LDAP(object):def __init__(self, host, port, user, password, base_dn):dn = "cn=%s,%s" % (user, base_dn)self.server = Server(host=host, port=port)self.base_dn = base_dnself.__conn = Connection(self.server, dn, password, auto_bind=True)def add_ou(self, ou, oid):"""参考: https://ldap3.readthedocs.io/tutorial_operations.html#create-an-entry添加oy:param ou: 'ou=测试部,dc=domain,dc=com' 或者 'ou=测试子部门,ou=测试部,dc=domain,dc=com':param oid: 部门id保存至st中:return:"""return self.__conn.add(ou, 'organizationalUnit', {"st": oid})def add_user(self, userid, username, mobile, mail, title, ou_dn, gidnumber=501, alias=None):"""参考: https://ldap3.readthedocs.io/tutorial_operations.html#create-an-entry:param userid:     "linan":param username:   "姓名" cn=姓名:param mobile::param mail:       "xxx@domain.com":param title::param ou_dn:     "ou=运维中心,dc=domain,dc=com":param gidnumber: 501 默认用户组:return:"""l = self.__connobjectclass = ['top', 'person', 'inetOrgPerson', 'posixAccount']add_dn = "cn=%s,%s" % (username, ou_dn)# 也可以随机生成,我先随便写一个值,这个需要自己定义规则password = '%s@qwe' % useriduidNumber = '%s' % userid.strip("xxx")# 添加用户s = l.add(add_dn, objectclass, {'mobile': mobile,'sn': userid,'mail': mail,'userPassword': password,'title': title,'uid': username,'gidNumber': gidnumber,'uidNumber': uidNumber,'homeDirectory': '/home/users/%s' % userid,'loginShell': '/bin/bash'})return sdef get_oudn_by_st(self, st, base_dn=None):"""根据 st值 获取组织dn参考: https://ldap3.readthedocs.io/tutorial_searches.html:param base_dn::param st:  部门id:return: entry"""if not base_dn:base_dn = self.base_dn# 查询ou 中 返回的信息 attribute 包含 ststatus = self.__conn.search(base_dn, '(objectclass=organizationalUnit)', attributes=["st"])if status:flag = Falsefor i in self.__conn.entries:if st:if st in i.entry_attributes_as_dict["st"]:return ielse:return Falseelse:return Falsedef get_object_classes_info(self, objec_classes):"""获取 Ldap中 object_classes的必要参数以及其他信息参考: https://ldap3.readthedocs.io/tutorial_searches.html:param objec_classes: objec_classes:return:"""print self.server.schema.object_classes[objec_classes]def get_userdn_by_mail(self, mail, base_dn=None):"""通过邮箱地址,获取用户dn。部分没有邮箱地址的用户被忽略,不能使用ldap认证参考: https://ldap3.readthedocs.io/tutorial_searches.html:param mail::param base_dn::return:"""if not base_dn:base_dn = self.base_dnstatus = self.__conn.search(base_dn,search_filter='(mail={})'.format(mail),search_scope=SUBTREE,attributes=ALL_ATTRIBUTES,)if status:flag = Falsefor i in self.__conn.entries:# print(i.entry_dn)return ielse:return Falseelse:return Falsedef get_userdn_by_args(self, base_dn=None, **kwargs):"""参考: https://ldap3.readthedocs.io/tutorial_searches.html获取用户dn, 通过 args可以支持多个参数: get_userdn_by_args(mail="xxx@domain.com", uid="姓名")会根据 kwargs 生成 search的内容,进行查询: 多个条件是 & and查询返回第一个查询到的结果,建议使用唯一标识符进行查询这个函数基本可以获取所有类型的数据:param base_dn::param kwargs::return:"""search = ""for k, v in kwargs.items():search += "(%s=%s)" % (k, v)if not base_dn:base_dn = self.base_dnif search:search_filter = '(&{})'.format(search)else:search_filter = ''status = self.__conn.search(base_dn,search_filter=search_filter,search_scope=SUBTREE,attributes=ALL_ATTRIBUTES)if status:return self.__conn.entrieselse:return Falsedef authenticate_userdn_by_mail(self, mail, password):"""验证用户名密码通过邮箱进行验证密码:param mail::param password::return:"""entry = self.get_userdn_by_mail(mail=mail)if entry:bind_dn = entry.entry_dntry:Connection(self.server, bind_dn, password, auto_bind=True)return Trueexcept LDAPBindError:return Falseelse:print("user: %s not exist! " % mail)return Falsedef update_user_info(self, user_dn, action=MODIFY_REPLACE, **kwargs):""":param dn: 用户dn 可以通过get_userdn_by_args,get_userdn_by_mail 获取:param action: MODIFY_REPLACE 对字段原值进行替换  MODIFY_ADD 在指定字段上增加值   MODIFY_DELETE 对指定字段的值进行删除:param kwargs: 要进行变更的信息内容 uid userPassword mail sn gidNumber uidNumber mobile title:return:"""allow_key  = "uid userPassword mail sn gidNumber uidNumber mobile title".split(" ")update_args = {}for k, v in kwargs.items():if k not in allow_key:msg = "字段: %s, 不允许进行修改, 不生效" % kprint(msg)return Falseupdate_args.update({k: [(action, [v])]})print(update_args)status = self.__conn.modify(user_dn, update_args)return statusdef update_user_cn(self, user_dn, new_cn):"""修改cndn: cn=用户,ou=运维部,ou=研发中心,dc=domain,dc=comrdn就是 cn=用户Example:from ldap3.utils.dn import safe_rdnsafe_rdn('cn=b.smith,ou=moved,ou=ldap3-tutorial,dc=demo1,dc=freeipa,dc=org')[cn=b.smith]:param dn::param new_cn::return:"""s = self.__conn.modify_dn(user_dn, 'cn=%s' % new_cn)return sdef update_ou(self, dn, new_ou_dn):"""更换所在的OU:param dn: 要进行变动的DN:param new_ou_dn:  新的OU DN:return:"""rdn = safe_rdn(dn)print(rdn)s = self.__conn.modify_dn(dn, rdn[0], new_superior=new_ou_dn)return sdef delete_dn(self, dn):"""要进行删除的DN:param dn::return:"""# 如果不是以cn开头的需要清理(删除) sub-linkif not dn.startswith("cn"):# 获取dn 下所有 sub Person DN 进行删除allUserEntry = self.get_userdn_by_args(base_dn=dn, objectClass="Person")if allUserEntry:for userentry in allUserEntry:self.__conn.delete(userentry.entry_dn)print("deleting ou %s and delete sub Person DN: %s" % (dn, userentry.entry_dn))# 获取dn 下所有 sub    OU进行删除allOuEntry = self.get_userdn_by_args(base_dn=dn, objectClass="organizationalUnit")if allOuEntry:for ouEntry in reversed(allOuEntry):s = self.__conn.delete(ouEntry.entry_dn)print("deleting ou %s and delete sub organizationalUnit DN: %s" % (dn, ouEntry.entry_dn))else:s = self.__conn.delete(dn)# print(self.__conn.result)return sif __name__ == '__main__':ldapObj = LDAP(**ldap_config)# 同步企业微信 组织架构 to Ldap# 同步企业微信 User  To ldap# -------------------------------# 删除DN, 对DN下的 sub 进行递归删除# s = ldapObj.get_oudn_by_st("1")# status = ldapObj.delete_dn(s.entry_dn)# print(status)# -------------------------------# 验证用户密码# s = ldapObj.authenticate_userdn_by_mail("linan@domain.com", "xxx9999@qwe")# - -----------------------------# 添加用户# s = ldapObj.add_user("xxx9999", "李南", "190283812", "linan@domain.com", "运维",#                  ou_dn="ou=运维中心,dc=domain,dc=com")# --------------------------------# 查询 ou st  组id# s = obj.get_oudn_by_st(st="1")# --------------------------------# 添加OU# obj.add_ou("ou=总部,dc=domain,dc=com", 1)# obj.add_ou("ou=研发中心,ou=总部,dc=domain,dc=com", 2)# --------------------------------# 查询用户是否存在 - 通过 mail  获取用户 dn_entry# ldapObj.get_userdn_by_mail(mail="linan@domain.com")# --------------------------------# 根据 参数 查询用户DN   data = [dn_entry, ...] ,多个参数为 &# data = ldapObj.get_userdn_by_args(cn="李南",mail="xxxx")# --------------------------------# 对指定dn 进行参数修改  多个参数可以一起修改# s = ldapObj.update_user_info(data[0].entry_dn, userPassword="123456")# --------------------------------# 对指定DN 变更 OU-DN# s = ldapObj.update_user_ou(data[0].entry_dn, s.entry_dn)# --------------------------------# 对指定DN 修改CN名称# ldapObj.update_cn(data[0].entry_dn,new_cn="李南男")# --------------------------------# 获取objectClass 详细信息# ldapObj.get_object_classes_info("organizationalUnit")# ldapObj.get_object_classes_info("posixAccount")# ldapObj.get_object_classes_info("inetOrgPerson")# ldapObj.get_object_classes_info("person")# 没有邮箱地址的用户:s = ldapObj.get_userdn_by_args(ou="研发中心")data= ldapObj.get_userdn_by_args(base_dn=s[0].entry_dn, objectclass = "organizationalUnit")for i in data:print(i.entry_dn)# print(s)

LDAP 和 LDAP3 的对比、接口调用(2)相关推荐

  1. LDAP 和 LDAP3 的对比、接口调用(1)

    一.ldap3库和python-ldap两者区别: python-ldap 主要是对OpenLDAP 的封装,同时也支持LDIF, LDAPURLs, LDAPv3.它用C+Python实现,提供的接 ...

  2. 【百度人脸识别】》人脸对比接口的调用

    大概流程: 进入百度云的人脸识别控制台 https://console.bce.baidu.com/?_=1602320265738#/index/overview 创建人脸识别应用 创建完成后,点击 ...

  3. 实现API接口调用--来源阿里云大学-归档

    # API的概念和基本实现 P.S.这篇文章的价值在于做了视频内容的复练,不用再盯着视频过一遍 from:来自阿里云大学的免费学习课程,实现API接口调用 时间戳:2020年8月21日11:00:15 ...

  4. python api调用百度ai平台_Python 百度AI接口调用

    接口调用准备 1.进入网站: https://console.bce.baidu.com/?_=1535519624081&fromai=1#/aip/overview 2.选择产品服务里的文 ...

  5. 企业微信自建引用接口调用报错[ErrorCode:301002]not allow operate another agent with this accesstoken

    1. 首先,在构建构造网页授权链接时,其中的参数agentid需要和你的自建应用id一致. 使用管理员账号登录网页版企业微信,查看AgentId 2. 使用accessToken对比agentid是否 ...

  6. PHP-微信开发之图灵机器人--天气接口调用

    微信开发中,图灵机器人回复.天气.翻译.美食.地图.二维码功能,随处可见.大小网站.APP都在运用这项技术在项目中.今天简单介绍一下图灵机器人回复,天气接口调用.翻译接口,希望对朋友们有用. 效果案例 ...

  7. 菜鸟裹裹快递查询接口调用

    为什么80%的码农都做不了架构师?>>>    声明:本文所有的内容只作学习使用. 菜鸟裹裹是阿里巴巴旗下菜鸟网络的产品,可用于查询淘宝的快递单号,除了快递状态.进程,还包含了淘宝发 ...

  8. 微服务如何限制接口调用次数

    这种限制接口调用次数的方式,我们通常称之为限流,那么为什么要做限流呢,一般有两种原因: 1. 首先是防止服务提供方被大量的请求击垮 我们开发一个项目,最理想的状况是有多少请求,都可以正常地响应,但是在 ...

  9. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)

    1. 接口的定义 接口是和调用方的一种约定,它是一个高度抽象的类型,不用和具体的实现细节绑定在一起.接口要做的是定义好约定,告诉调用方自己可以做什么,但不用知道它的内部实现,这和我们见到的具体的类型如 ...

最新文章

  1. python log函数怎么打_Python的log日志功能及设置方法
  2. Daydream VR
  3. Python 实用技巧之正则表达式查找和替换文本的操作方法
  4. 美工一流的个人网站源码系列(2),不漂亮你可以不下载!
  5. scheme 学习:pair 和 list
  6. 关于今天写Flex视频循环播放所出现的sdk问题
  7. MFC的程序,不想显示窗口,任务栏里也不显示
  8. tomcat中配置jndi数据源以便spring获取
  9. java.util.UnknownFormatConversionException: Conversion = ‘j‘ || Conversion = ‘D‘ || Conversion = ‘Y‘
  10. uniapp滑动切换tab标签_Web前端,Tab切换,缓存,页面处理的几种方式
  11. FreeSql (三十一)分区分表
  12. Swift学习笔记十二
  13. 【C语言】初学者写基础代码的基本步骤
  14. SpringCloud入门之项目实例
  15. HTML怎么跟随页面缩放,如何让网页跟着 浏览器全比例缩小(示例代码)
  16. java实现word文档转pdf,并添加水印
  17. SCI论文从入门到精通——IEEE论文那些事儿
  18. php断言什么意思,一起学习PHP中断言函数的使用
  19. 云聚华为伙伴暨开发者大会GaussDB专场
  20. JiangxiBank

热门文章

  1. 1到3岁宝宝如何选择玩具
  2. 《CalliGAN: Style and Structure-aware Chinese Calligraphy Character Generator》论文笔记
  3. 为何NB-LOT 覆盖比较广
  4. 软件测试是干什么的 通过各种方式检查软件的质量问题
  5. 抖音赛道是啥?有什么逻辑?
  6. x3850X5如何添加CPU和QPI Wrap Card及两节点配置说明
  7. vector sort 出现异常处理--std::sort(_RanIt,_RanIt,_Pr)
  8. 免费在线html文档,HTML标签大全(最全的html标签文档).doc
  9. 事关年终奖,备受关注的项目绩效管理攻略来喽
  10. Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录