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(用户名,密码))