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

Wagtail多站点实现跨站登录状态共享方案咨询

Wagtail多站点单点登录(SSO)实现方案

Wagtail基于Django构建,多站点SSO的核心是实现跨域会话共享或统一认证中心,以下是两种主流场景的具体实现步骤:

场景1:同父域下的子站点(如site1.example.com、site2.example.com)

这种场景下可通过共享会话Cookie和统一用户数据实现SSO,成本最低:

1. 统一用户数据与认证后端

  • 所有Wagtail站点必须连接同一个数据库,确保用户数据完全共享;若无法共用数据库,需配置数据库主从同步保证用户数据一致。
  • 保持所有站点的AUTH_USER_MODEL一致(默认使用django.contrib.auth.models.User或自定义统一用户模型),认证后端配置相同。

2. 跨域会话Cookie配置

在所有站点的settings.py中添加以下配置,让浏览器在所有子域下共享会话Cookie:

# 会话Cookie域名设为父域(注意开头的点)
SESSION_COOKIE_DOMAIN = '.example.com'
# CSRF Cookie同步配置
CSRF_COOKIE_DOMAIN = '.example.com'
# 统一会话/CSRF Cookie名称,避免不同站点Cookie冲突
SESSION_COOKIE_NAME = 'wagtail_shared_sessionid'
CSRF_COOKIE_NAME = 'wagtail_shared_csrf'
# 生产环境强制HTTPS传输Cookie
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# 增强Cookie安全性
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True

3. 共享会话存储

默认的数据库会话存储可满足需求,若站点数量多、访问量大,建议用Redis等分布式缓存存储会话,提升性能:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://your-redis-host:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}

4. 跨域CSRF信任配置

在所有站点的settings.py中添加信任的子域,避免跨域请求被CSRF拦截:

CSRF_TRUSTED_ORIGINS = [
    'https://*.example.com',
    'http://*.example.com',  # 开发环境保留
]

关键注意事项

  • 所有站点必须使用完全相同的SECRET_KEY,Django用它签名会话Cookie,密钥不一致会导致跨站点会话失效。
  • 确保浏览器允许第三方Cookie(部分浏览器默认阻止,需在测试/用户端开启)。

场景2:完全独立的域名(如siteA.com、siteB.com)

这种场景下无法通过Cookie共享实现,需搭建统一认证中心,基于OAuth2或SAML协议实现SSO:

1. 搭建主认证服务器(以其中一个Wagtail站点为例)

  • 安装django-oauth-toolkit,配置为OAuth2认证服务器:
    INSTALLED_APPS = [
        # ...
        'oauth2_provider',
    ]
    
    OAUTH2_PROVIDER = {
        'ACCESS_TOKEN_EXPIRE_SECONDS': 3600,
        'AUTHORIZATION_CODE_EXPIRE_SECONDS': 600,
        'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups'},
        'ALLOWED_REDIRECT_URI_SCHEMES': ['https', 'http']  # 开发环境允许http
    }
    
  • 在后台创建OAuth2应用,记录客户端ID、客户端密钥,配置回调地址为其他Wagtail站点的认证回调URL。

2. 客户端Wagtail站点配置

  • 安装social-auth-app-django或django-allauth,配置OAuth2认证后端,指向主认证服务器的端点:
    INSTALLED_APPS = [
        # ...
        'social_django',
    ]
    
    AUTHENTICATION_BACKENDS = [
        'social_core.backends.oauth2.OAuth2Backend',
        'django.contrib.auth.backends.ModelBackend',
    ]
    
    SOCIAL_AUTH_OAUTH2_KEY = '你的客户端ID'
    SOCIAL_AUTH_OAUTH2_SECRET = '你的客户端密钥'
    SOCIAL_AUTH_OAUTH2_AUTHORIZATION_URL = 'https://auth.example.com/o/authorize/'
    SOCIAL_AUTH_OAUTH2_ACCESS_TOKEN_URL = 'https://auth.example.com/o/token/'
    SOCIAL_AUTH_OAUTH2_USER_INFO_URL = 'https://auth.example.com/o/userinfo/'
    
  • 配置登录视图,将用户引导至主认证服务器登录,登录成功后自动在客户端站点创建/关联用户,同步登录状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:54:14