Sulu CMS自定义认证生产环境无限重定向:SULUSESSID重置排查
Sulu CMS生产环境SSO认证无限重定向循环问题排查
我们有多站点Sulu CMS部署,其中一个站点通过自定义SSO登录认证器保护。该功能在本地和DEV环境运行正常,但生产环境出现无限重定向循环。
相关配置
config/packages/security.yaml内容如下:
security: # ... firewalls: protected_website: host: '^(dev\.|www\.)?protected-website(\.localhost|\.local|\.test|\.org)$' pattern: ^/ custom_authenticators: - App\Security\SsoSessionAuthenticator provider: sso_session lazy: true
认证循环流程
- 访问
https://www.protected-website.org/→ 302跳转到SSO的/oauth2/authorize/登录页 - 在SSO的
/oauth2/authorize/登录后 → 302跳转到https://www.protected-website.org/sso-login?code=.. - 访问
https://www.protected-website.org/sso-login?code=..时,设置Cookie:SULUSESSID=d1db129af3b1c185aca1d80bcee294ee; path=/; secure; httponly; samesite=lax(登录成功)→ 302跳转到https://www.protected-website.org - 访问
https://www.protected-website.org时,设置Cookie:SULUSESSID=deleted; expires=Thu, 20 Feb 2025 00:43:43 GMT; Max-Age=0; path=/; secure; httponly; samesite=lax - 用户身份失效,认证流程重新触发,形成循环
可能的原因及排查点
1. 防火墙主机匹配规则异常
检查protected_website防火墙的host正则是否准确匹配生产域名www.protected-website.org:
- 确认正则中
protected-website的拼写与实际域名完全一致 - 若生产环境存在裸域名(
protected-website.org)访问,当前正则的(dev\.|www\.)?会匹配裸域名,但需验证实际请求的Host是否被正确识别 - 若防火墙规则不匹配,请求会走其他默认防火墙,导致已建立的SSO会话不被识别,触发会话重置
2. 会话Cookie域名配置错误
本地/DEV环境使用.localhost/.local泛域名,生产环境需确保会话Cookie的domain参数正确设置:
检查config/packages/framework.yaml的会话配置:
framework: session: cookie_domain: '.protected-website.org' cookie_secure: true cookie_samesite: 'lax'
若未设置泛域名,www.protected-website.org下生成的Cookie无法在根域名或其他子域名下被识别,导致跳转后主域名无法读取会话,触发重置。
3. 自定义认证器逻辑缺陷
排查App\Security\SsoSessionAuthenticator的核心逻辑:
- 确认
onAuthenticationSuccess方法是否正确存储认证令牌,是否调用$session->set('_security_protected_website', $token)(对应防火墙名称的会话键) - 检查认证器是否存在隐式登出逻辑,比如认证成功后意外调用了
$tokenStorage->setToken(null)或会话销毁方法 - 生产环境是否额外添加了用户状态校验(如IP白名单、账号有效性),导致认证成功后又被判定为无效
4. 反向代理信任配置缺失
生产环境的反向代理/负载均衡器未被Symfony信任,会导致:
- Symfony无法识别HTTPS协议,
secure属性的Cookie无法被正确传递 - 客户端IP识别错误,触发基于IP的会话验证失败
检查config/packages/framework.yaml:
framework: trusted_proxies: '%env(TRUSTED_PROXIES)%' trusted_hosts: '%env(TRUSTED_HOSTS)%'
确保TRUSTED_PROXIES包含代理服务器IP,TRUSTED_HOSTS包含生产域名。
5. 多站点会话冲突
多站点部署下,Sulu默认按站点隔离会话:
- 检查是否为受保护站点配置了独立的会话存储
- 确认其他站点的会话配置未覆盖当前站点的Cookie参数(如
cookie_domain、cookie_path)
6. 服务器时间不同步
生产服务器与SSO服务器时间差过大,会导致OAuth2授权码code的过期校验失败,认证成功后立即被判定为无效,触发会话重置。检查两台服务器的系统时间是否一致。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

