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(用户名,密码))
posted @ 2020-03-30 19:49  李大鹅  阅读(4883)  评论(0编辑  收藏  举报