Django Tenants跨子域重定向会话丢失问题求助
Django Tenants跨子域会话丢失问题排查
问题描述
我正在使用Django Tenants开发SaaS项目,遇到跨子域重定向时用户会话无法保持的问题。
配置详情
- 自定义用户模型为
CustomUser(位于SHARED_APPS的account应用中) Tenant模型与CustomUser为一对一关联
认证流程
用户在主域名localhost:8000登录,后端通过login(request, user)完成认证,随后跳转到子域http://tenant1.localhost:8000。
核心问题
跳转到子域后用户变为AnonymousUser,主域与子域间会话未被传递或识别。
已配置的settings.py片段
# 本地开发禁用安全设置(HTTP) SESSION_COOKIE_SECURE = False CSRF_COOKIE_SECURE = False SESSION_COOKIE_SAMESITE = 'Lax'
请问是否遗漏了django-tenants或会话中间件的特定配置,以确保会话Cookie在所有模式/域名下有效?
解决方案
你的问题根源是会话Cookie的域名范围未覆盖子域,Django默认仅将Cookie绑定到当前请求的域名,子域无法读取主域的Cookie。需要补充以下关键配置:
1. 配置Cookie的跨子域生效域名
在settings.py中添加或修改:
# 让Cookie对所有localhost子域生效(带端口的本地开发场景) SESSION_COOKIE_DOMAIN = '.localhost:8000' CSRF_COOKIE_DOMAIN = '.localhost:8000'
生产环境提示:若使用不带端口的顶级域名(如
example.com),只需设置为.example.com即可覆盖所有子域。
2. 确认中间件加载顺序
确保会话和认证中间件在Django Tenants中间件之前加载,正确顺序如下:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', # Django Tenants中间件必须放在后面 'django_tenants.middleware.main.TenantMainMiddleware', ]
3. 确保会话应用在共享应用列表
如果使用默认数据库会话存储,django.contrib.sessions必须加入SHARED_APPS,这样会话数据才能在所有租户间共享:
SHARED_APPS = [ 'django_tenants', 'your_tenant_app', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', # 必须在此列表中 'django.contrib.messages', 'django.contrib.staticfiles', 'account', # 存放CustomUser的应用 ]
4. 清除旧Cookie测试
修改配置后,务必清除浏览器中已有的旧Cookie(旧Cookie的域名是主域,无法被子域识别),再重新登录验证会话是否正常传递。
内容的提问来源于stack exchange,提问作者Boaz Kalonji
相关产品推荐
相关产品推荐

