Django-Axes部署后多次登录失败不锁定用户问题求助
Django-Axes 服务器环境下无法锁定用户(本地正常、日志正常)排查方案
已知场景:
- 本地localhost测试时,连续登录失败后能正常触发用户/IP锁定
- 部署到服务器后,登录失败日志可正常写入数据库,但达到失败次数阈值后未触发锁定
- 已配置
AXES_LOCK_OUT_AT_FAILURE = True,执行过python manage.py migrate和python manage.py check,因MySQL设置USE_TZ = False
以下是针对性排查与解决步骤:
1. 确认Axes中间件顺序
AxesMiddleware必须放在认证和会话中间件之后,如果服务器上的MIDDLEWARE顺序与本地不一致,会导致锁机制失效。正确顺序示例:
MIDDLEWARE = [ 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', # AxesMiddleware 必须位于此处之后 'axes.middleware.AxesMiddleware', # 其他中间件... ]
2. 修复服务器环境下的IP识别问题
服务器通常会配置反向代理(Nginx/Apache),Axes默认获取的是代理服务器IP而非真实客户端IP,导致所有请求被识别为同一IP,无法正确累计失败次数。添加以下配置:
AXES_TRUST_PROXY = True # 指定优先从代理头获取真实IP AXES_META_PRECEDENCE_ORDER = [ 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR', ]
3. 验证时间一致性
虽然设置了USE_TZ = False,需确保服务器系统时间与Django的TIME_ZONE配置完全匹配。执行以下命令验证:
python manage.py shell >>> from django.utils import timezone >>> print(timezone.now())
对比输出时间与服务器系统时间,若存在偏差,Axes的冷却时间和锁定判断逻辑会失效。
4. 检查缓存配置(关键)
Axes依赖Django缓存跟踪失败次数,服务器多进程部署(如Gunicorn/uWSGI)时,默认的LocMemCache无法跨进程共享数据,导致失败次数无法累计。需切换为分布式缓存,示例Redis配置:
CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } }
5. 确认认证后端顺序
确保AxesStandaloneBackend是AUTHENTICATION_BACKENDS的第一个后端,服务器配置需与本地完全一致,否则Axes的锁定逻辑无法优先执行。
6. 使用真实客户端IP测试
若在服务器本地测试(如curl localhost),Axes识别的是服务器本地IP,可能与过往日志IP混淆。建议从外部客户端发起测试请求,或用工具模拟不同IP的失败登录。
7. 检查锁定范围配置
若需要锁定用户而非仅IP,需确认配置是否与本地一致:
# 可选:锁定用户+IP组合 AXES_LOCK_OUT_BY_COMBINATION_USER_AND_IP = True # 或单独锁定用户 AXES_LOCK_OUT_BY_USER = True
内容的提问来源于stack exchange,提问作者gaviaostack
相关产品推荐
相关产品推荐

