python-ldap认证输入密码提示无效凭证,留空密码却可通过
Python-ldap认证异常:输入密码失败、空密码返回True的解决办法
核心原因分析
- 绑定DN不完整:你当前使用的
un = 'xxx.x.xxxx'只是用户名,LDAP普通用户认证需要完整的区分名(DN),比如cn=xxx.x.xxxx,ou=Users,dc=xxx,dc=xxx。空密码返回True大概率是因为LDAP服务器允许匿名绑定,并非真正的用户认证通过。 - 匿名访问配置:部分LDAP服务器默认开启匿名连接权限,空密码时触发了匿名绑定,导致返回True;而使用不完整的用户名+密码时,服务器无法识别有效用户,抛出无效凭证错误。
- 密码编码问题:python-ldap要求密码参数为字节类型,若直接传入字符串可能在部分环境下导致认证失败。
解决步骤及修正代码
获取用户完整DN
使用LDAP搜索工具查询用户的完整DN,例如通过命令行:ldapsearch -x -b "dc=xxx,dc=xxx" "(cn=xxx.x.xxxx)" dn把查询到的完整DN替换到代码的
un变量中。修正认证代码
以下是调整后的代码,解决了DN格式和密码编码问题:import ldap, sys # 替换为查询到的完整用户DN un = 'cn=xxx.x.xxxx,ou=Users,dc=xxx,dc=xxx' secret = '你的用户密码' server = "ldap://xxx.xxx.xxx.xxx:xxx" def checkUser(): l = None try: l = ldap.initialize(server) l.set_option(ldap.OPT_REFERRALS, 0) l.protocol_version = ldap.VERSION3 # 将密码转为UTF-8编码的字节 rex = l.simple_bind_s(un, secret.encode('utf-8')) print(rex) return True except ldap.INVALID_CREDENTIALS: print("Invalid creds") return False except ldap.SERVER_DOWN: print("Server down") return False except ldap.LDAPError as e: print(f"Error {e}") return False finally: # 确保连接已初始化时再解绑 if l: l.unbind_s() x = checkUser() print(x)额外检查
- 确认LDAP服务器是否需要关闭匿名访问:若不需要匿名连接,可在服务器配置中禁用,避免空密码返回True的误导性结果。
- 验证密码准确性:确保输入的密码与LDAP存储的用户密码完全一致,注意大小写、特殊字符的匹配。
内容的提问来源于stack exchange,提问作者chayi
相关产品推荐
相关产品推荐

