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

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

认证循环流程

  1. 访问https://www.protected-website.org/ → 302跳转到SSO的/oauth2/authorize/登录页
  2. 在SSO的/oauth2/authorize/登录后 → 302跳转到https://www.protected-website.org/sso-login?code=..
  3. 访问https://www.protected-website.org/sso-login?code=..时,设置Cookie:SULUSESSID=d1db129af3b1c185aca1d80bcee294ee; path=/; secure; httponly; samesite=lax(登录成功)→ 302跳转到https://www.protected-website.org
  4. 访问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
  5. 用户身份失效,认证流程重新触发,形成循环

可能的原因及排查点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 13:04:58