zoukankan      html  css  js  c++  java
  • 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(用户名,密码))
    
  • 相关阅读:
    关于Ajax中this失效
    添加时间周期一年半年季度
    回车事件
    alt与title
    关于checked="checked"却不显示选中的“对勾”
    正则表达式的使用
    关于JQ 查找不到对象的clientHeight,
    Mysql笔记之 -- 开启Mysql慢查询
    Mysql笔记之 -- 小试MYSQL主从配置
    Linux系统学习笔记之 1 一个简单的shell程序
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/12600710.html
Copyright © 2011-2022 走看看