如何排查Django LDAP连接故障:Django Rest活动目录认证异常
排查步骤
1. 首先开启django-auth-ldap的调试日志,定位具体报错原因
你当前看不到报错是因为没有开启对应日志模块,在settings.py中添加如下日志配置,重启服务后再次尝试登录,即可看到完整的LDAP交互日志:
LOGGING = { "version": 1, "disable_existing_loggers": False, "handlers": {"console": {"class": "logging.StreamHandler"}}, "loggers": { "django_auth_ldap": {"level": "DEBUG", "handlers": ["console"]}, "django": {"level": "INFO", "handlers": ["console"]}, }, }
2. 先修正你当前配置中的明显错误
- 缺失必填的用户搜索配置:你只配置了
AUTH_LDAP_GROUP_SEARCH,没有配置AUTH_LDAP_USER_SEARCH,框架无法从AD中匹配到你输入的登录账号,补充配置参考:
AUTH_LDAP_USER_SEARCH = LDAPSearch( "OU=Users,OU=ad_server,DC=ad_server,DC=com", ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)", )
- AD组类型配置错误:
GroupOfNamesType是OpenLDAP的组类型,AD的组需要用ActiveDirectoryGroupType,修改导入和配置:
# 替换原来的GroupOfNamesType导入 from django_auth_ldap.config import LDAPSearch, ActiveDirectoryGroupType # 修改组类型配置 AUTH_LDAP_GROUP_TYPE = ActiveDirectoryGroupType(name_attr="cn")
- 无效的拒绝组配置:你当前的
AUTH_LDAP_DENY_GROUP是dc=example,dc=com的测试配置,和你实际的AD域不一致,要么改成你实际的禁用组DN,要么先注释掉这个配置避免误拦截。 - 用户名属性映射错误:AD环境下登录账号对应的属性是
sAMAccountName,不是cn,修改AUTH_LDAP_USER_ATTR_MAP中的username配置:
AUTH_LDAP_USER_ATTR_MAP = { "first_name": "givenName", "last_name": "sn", "username": "sAMAccountName", "email": "mail", }
3. 单独运行LDAP认证测试,绕开Admin页面链路
在Django shell中直接调用认证方法,可以跳过路由、Session等无关逻辑,直接定位认证模块问题:
# 执行python manage.py shell进入交互环境 from django.contrib.auth import authenticate user = authenticate(username="你的AD测试账号", password="对应的密码") print(user) # 打印None就是认证失败,结合前面的调试日志看具体错误
4. 其他常见排查点
- 确认你登录用的AD账号属于
CN=prod,OU=Groups,OU=ad_server,DC=ad_server,DC=com组,否则会被AUTH_LDAP_REQUIRE_GROUP直接拦截 - 检查AD服务器是否开启了LDAP签名要求,如果是需要把
AUTH_LDAP_SERVER_URI改成ldaps://开头的LDAPS协议,或者配置ldap选项启用通信加密 - 先注释掉
AUTH_LDAP_USER_FLAGS_BY_GROUP、AUTH_LDAP_FIND_GROUP_PERMS等权限相关配置,先跑通基础认证再逐步增加权限逻辑
内容的提问来源于stack exchange,提问作者Moe
相关产品推荐
相关产品推荐

