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
相关产品推荐
相关产品推荐

