You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Django Tenants开发SaaS项目时子域重定向后的用户会话保持问题求助

解决Django Tenants中子域会话丢失的问题

我之前在开发基于Django Tenants的SaaS项目时,也碰到过和你一模一样的问题——主域登录后重定向到子域,用户直接变成了匿名用户。这个问题的核心原因是默认的Session Cookie只绑定到当前请求的域,子域无法读取主域设置的Cookie。下面是我亲测有效的解决方案:

1. 配置Cookie的域属性(最关键)

在settings.py中添加或修改以下配置,让Session和CSRF Cookie允许所有子域共享:

# 允许所有localhost的子域共享Cookie(注意前面的点)
SESSION_COOKIE_DOMAIN = '.localhost'
CSRF_COOKIE_DOMAIN = '.localhost'

# 你已有的配置可以保留
SESSION_COOKIE_SECURE = False
CSRF_COOKIE_SECURE = False
SESSION_COOKIE_SAMESITE = 'Lax'

这里的.localhost表示所有以localhost为后缀的子域(比如tenant1.localhost:8000)都能读取这个Cookie。开发环境下端口不会影响Cookie的域识别,所以不用带端口。

2. 确认中间件顺序

确保TenantMainMiddleware和会话相关中间件的顺序正确,推荐的顺序是:

MIDDLEWARE = [
    # 先处理租户识别
    'django_tenants.middleware.main.TenantMainMiddleware',
    'django.middleware.security.SecurityMiddleware',
    # 再加载会话
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    # 最后处理认证
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 其他你的自定义中间件...
]

这样的顺序能保证在加载会话前先识别当前请求的租户(主域对应公共租户,子域对应业务租户),避免会话加载时出现上下文不匹配的问题。

3. 验证自定义用户模型的配置

确认你的CustomUser模型和认证配置没有问题:

  • 确保CustomUser正确继承了AbstractBaseUser或AbstractUser,并且实现了必要的方法(比如get_username());
  • 在settings.py中正确指定自定义用户模型:
    AUTH_USER_MODEL = 'account.CustomUser'
    
  • 登录时确保调用django.contrib.auth.login(request, user)时,传入的user对象是有效的CustomUser实例,且和对应的Tenant存在正确的一对一关联。

4. 清除浏览器缓存

浏览器有时候会缓存旧的Cookie,导致新的配置无法立即生效。建议你清除浏览器的Cookie,或者使用隐私模式重新测试登录和重定向流程。


内容的提问来源于stack exchange,提问作者Boaz Kalonji

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 06:39:19