Python对接LDAP/AD的过程详解

这篇具有很好参考价值的文章主要介绍了Python对接LDAP/AD的过程详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

不同公司的 LDAP/AD 服务配置各不相同,很难封装一个通用的方法,所以我们在对接 LDAP/AD 的过程中,需要了解自己公司的 LDAP/AD 服务配置是怎么样的,才能写出正确的对接代码,因此下面将拆解过程并提供相关的文档地址。

首先需要了解一些 LDAP/AD 的基本概念:

  • dc:域名的部分,其格式是将完整的域名分成几部分,如域名为 example.com 变成 dc=example,dc=com(一条记录的所属位置)
  • uid:用户ID
  • ou:组织单位,组织单位可以包含其他各种对象(包括其他组织单元)
  • cn:公共名称
  • sn:姓
  • dn:一条记录的位置(唯一)
  • rdn:相对辨别名,类似于文件系统中的相对路径,它是与目录树结构无关的部分

Python 对接 LDAP 目前主要有两个库,ldap3 和 python-ldap 库:

库名称 实现语言 接口风格
ldap3 纯Python 偏向对象
python-ldap 混合C+Python 偏向过程

综上对比,推荐使用 ldap3 实现 LDAP 对接:

pip install ldap3

首先通过 PIP 安装 ldap3 库,并导入相关类到代码中:

from ldap3 import Server, Connection, ALL

通过 LDAP 服务器地址创建一个 LDAP 服务对象:

server = Server('127.0.0.1', get_info=ALL)
print(server)
# Server(host='127.0.0.1', port=389, use_ssl=False, allowed_referral_hosts=[('*', True)], get_info='ALL', mode='IP_V6_PREFERRED')

观察 LDAP 服务对象的输出信息:

输出信息 含义
host=‘127.0.0.1’ LDAP 服务器 IP 或 URL
port=389 服务端口,默认就是 389 端口
use_ssl=False 是否使用 SSL,如果为 True,意味需要 建立安全连接
allowed_referral_hosts=[(‘*’, True)] 限定允许请求的主机
get_info=‘ALL’ 是否必须读取服务器架构和服务器特定信息
mode=‘IP_V6_PREFERRED’ 用于解析 DNS 中的 LDAP 服务器名称的双 IP 堆栈行为

更详细的配置及其含义可以查看 LDAP 服务对象 (server-object) 文档。

使用 LDAP 服务对象,基于一个公用账号(使用公有账号可以确保服务稳定)建立 LDAP 连接:

conn = Connection(server, user='Domain\\User', password='password', auto_bind=True, raise_exceptions=True)
print(conn)
# Connection(server=Server(host='127.0.0.1', port=389, use_ssl=False, allowed_referral_hosts=[('*', True)], get_info='ALL', mode='IP_V6_PREFERRED'), user='Domain\\User', password='password', auto_bind='NO_TLS', version=3, authentication='SIMPLE', client_strategy='SYNC', auto_referrals=True, check_names=True, read_only=False, lazy=False, raise_exceptions=False, fast_decoder=True, auto_range=True, return_empty_attributes=True, auto_encode=True, auto_escape=True, use_referral_cache=False)

观察 LDAP 连接对象的输出信息:

输出信息 含义
user=‘Domain\User’ 绑定的用户的帐户
password=‘password’ 绑定的用户密码
auto_bind=‘NO_TLS’ 自动打开并绑定连接
version=3 LDAP 协议版本
authentication=‘SIMPLE’ 身份验证方法
client_strategy=‘SYNC’ 客户端使用的通信策略
auto_referrals=True 指定连接是否服务器中允许的
check_names=True 搜索结果将按照结构中指定的格式进行格式化
read_only=False True 时禁止修改、删除、添加等操作
lazy=False True 时连接将延迟打开和绑定,直到请求另一个 LDAP 操作
raise_exceptions=False True 时引发 LDAPOperationResult 的异常
fast_decoder=True False 时使用 pyasn1 解码器而不是内部解码器

更详细的配置及其含义可以查看 LDAP 连接对象 (Connection) 文档。

到这一步的时候,可以询问 LDAP 服务器当前连接用户是谁?简单验证一下连接有效性:

conn.extend.standard.who_am_i()
# 'u:Domain\\User'

使用公用账号查询某个用户的 SAMAccountName 信息是否存在:

result = conn.search(search_base='OU=OU,DC=Domain,DC=LOCAL', search_filter='(sAMAccountName=xiaoming)')
# True

观察 LDAP 连接对象的 search() 函数输入/输出信息:

  • 输入
    • search_base = 搜索用户的基础路径
    • search_filter = 过滤 LDAP 用户的过滤器语句
      • sAMAccountName = 用于存储账户登录名或用户符号,实际上是命名符号 Domain\LogonName,该属性是域用户对象的必需属性
  • 输出
    • result = True 表示用户存在,否则用户不存在

如果上一步的用户查询成功,即结果为 True,下面就可以查看其 response 信息,获取查询到的用户详细信息:

conn.response
# [{'raw_dn': b'CN=\xbd...,DC=LOCAL', 'dn': 'CN=小明-10001001,OU=自动化测试组,OU=测试部,OU=研发中心,OU=Domain,OU=行政组织,OU=OU,DC=LEEDARSON,DC=LOCAL', 'raw_attributes': {}, 'attributes': {}, 'type': 'searchResEntry'}]

上面返回的用户 dn 信息有两种:

  • raw_dn 原始信息
    conn.response[0]['raw_dn'].decode('UTF-8')
    # 'CN=小明-10001001,OU=自动化测试组,OU=测试部,OU=研发中心,OU=Domain,OU=行政组织,OU=OU,DC=LEEDARSON,DC=LOCAL'
    
  • dn 可读信息
    conn.response[0]['dn']
    # 'CN=小明-10001001,OU=自动化测试组,OU=测试部,OU=研发中心,OU=Domain,OU=行政组织,OU=OU,DC=LEEDARSON,DC=LOCAL'
    

不管是那种格式,信息本身的内容是一样的。默认情况下使用 user_dn = conn.response[0]['dn'] 获取用户 dn 信息就可以。

接下来就使用用户 dn 信息去验证用户的密码是否正确,如果密码正确,就和前面公用账号登录一样可以获取用户信息。如果登录异常,我们可以根据响应内容判断具体异常的原因:

from ldap3.core.exceptions import LDAPInvalidCredentialsResult

try:
    Connection(server, user=user_dn, password='password', auto_bind=True, raise_exceptions=True)
except LDAPInvalidCredentialsResult as e:
    if '52e' in e.message:
        print('账号密码不正确')
    elif '775' in e.message:
        print('账号已锁定,请联系管理员或等待自动解锁')
    elif '533' in e.message:
        print('账号已禁用')
    else:
        print('认证失败,请联系管理员检查该账号')

更多具体的情况,就需要实际对接公司的 LDAP/AD 服务时,才会遇到了。文章来源地址https://www.toymoban.com/news/detail-449129.html

到了这里,关于Python对接LDAP/AD的过程详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python编程实现百度AI开放平台的接口对接方法,详解和实践指南

    Python编程实现百度AI开放平台的接口对接方法,详解和实践指南 引言 百度AI开放平台提供了丰富的人工智能接口,包括语音识别、图像识别、自然语言处理等功能。本文将通过Python编程,详解如何对接百度AI开放平台的接口,并提供实际代码示例。 准备工作 在开始之前,我们

    2024年02月13日
    浏览(46)
  • 适配器模式:转换接口,无缝对接不同系统

    适配器模式在软件设计中扮演着桥梁角色,解决不同接口之间的兼容问题。该模式通过创建一个适配器类,将原本不兼容的接口转换为预期的目标接口,使得原本无法协同工作的组件得以和谐共存。在现代软件开发中,适配器模式广泛应用于遗留系统升级、跨平台API调用、第

    2024年02月22日
    浏览(45)
  • AD从文档中复制文字批量放置不同网络标签

    在可复制文字的文档中,试过Excel表格,ctrl+c(复制),然后在AD原理图窗口中shift+ctrl+v(智能粘贴),就会弹出如下界面: 选择完之后,就会生成和文本内容一致的网络标号(Net Labels)。

    2024年02月09日
    浏览(43)
  • 如何保护 LDAP 目录服务中的用户安全?

    轻量级目录访问协议(LDAP)是目前主流的身份验证协议之一,由密歇根大学的 Tim Howes、Steve Kille 和 Wengyik Yeong 于1993年创建,又经过了 Internet 工程任务组(IETF)的标准化,通过网络分发目录信息,扮演了身份源(IdP)的角色。 LDAP 在现代网络中的重要性在于该协议参与共享

    2024年01月17日
    浏览(60)
  • 第67篇:美国安全公司溯源分析Solarwinds供应链攻击事件全过程

    大家好,我是ABC_123 。本期继续分享Solarwinds供应链攻击事件的第4篇文章,就是美国FireEye火眼安全公司在遭受攻击者入侵之后,是如何一步步地将史上最严重的Solarwinds供应链攻击事件溯源出来的。 注: Mandiant安全公司已被FireEye收购,但是仍然可以独立运营,严格地说的,这

    2024年02月03日
    浏览(45)
  • 如何基于钉钉通讯录生成LDAP服务

    这是一个很有意思的需求,即 通过基于钉钉通讯录搭建LDAP服务, 场景非常的典型,用户已经有了钉钉的组织架构来管理员工身份,那么如何利用当前的钉钉组织架构和用户身份,生成对外的LDAP服务呢? 为何要生成LDAP服务? 因为,企业内有不少应用的登录和账号管理,可以

    2023年04月09日
    浏览(65)
  • 十年JAVA搬砖路——Linux搭建Ldap服务器。

    1.安装命令 2.启动ldap 3.修改密码 获得返回的密码加密密码串: {SSHA}DkSw0+43+u4PK7c7F1GtoubEWHnrz3bG 去slapd.d 目录 创建db.ldif 文件 文件内容: #各个命令的说明 { 第一条语句修改了olcSuffix属性,该属性表示LDAP目录的后缀(基础DN)。它被替换为\\\"dc=ricman,dc=localhost\\\"。 第二条语句修改了

    2024年02月06日
    浏览(38)
  • Linux(centos7.9)搭建ldap服务器

    一.LDAP是什么  后期更新,目前只搭建了服务器   二.linux搭建LDAP服务器 以下服务器信息为该文档安装ldap服务环境   服务器信息:CentOS7    内核版本:3.10.0-1160.el7.x86_64   1.使用yum进行安装   2.安装完毕后,检查服务运行状态 安装完之后,直接启动服务并且将服务设置为自启

    2024年02月03日
    浏览(53)
  • 搭建gerrit服务器+LDAP认证+集成gitewb详细流程

    Gerrit,一种免费、开放源代码的代码审查软件,使用网页界面。利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代码,决定是否能够提交,退回或者继续修改。它使用Git作为底层版本控制系统。 本文介绍如何搭建gerrit服务器,以及搭配LDAP认证的

    2024年02月02日
    浏览(49)
  • AD19 PCB板完整绘制过程(4层)

    AD19 PCB板完整绘制过程 1 、原理图导入 一个项目的电路原理图完成后,我们需要在Design选项下Update PCB Document xxxx.PcbDoC。 Fig 1 在更新的过程中,当Report Changes…时会出现很多错误,需要我们进行改正(可以点击Only Show Errors,只显示错误),例如 Fig 2 Massage中的信息会告诉我们错误

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包