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

Grails部署Tomcat后Spring Security将已认证用户识别为匿名用户

Grails Spring Security 部署后认证状态丢失与HTTP/HTTPS关联说明

这个问题和HTTP、HTTPS协议混用的关联度极高,是该版本Grails+Spring Security插件部署时的常见问题,核心原因与会话Cookie的安全属性限制、跨协议请求的Cookie传递逻辑有关,具体原因和解决方案如下:

问题根因

  • 本地运行时默认使用单HTTP协议,不存在跨协议跳转场景,会话Cookie可以正常随所有请求携带,认证状态不会丢失。
  • 部署到Tomcat后如果站点同时开启HTTP和HTTPS,或存在登录流程走HTTPS、登录成功后跳转到HTTP,或者反过来的跨协议跳转逻辑,会触发Cookie的Secure属性限制:一旦Cookie被设置了Secure标识,浏览器只会在HTTPS请求中携带该Cookie,HTTP请求不会携带,导致服务端拿不到会话ID,自然将用户识别为匿名用户,springSecurity.isLoggedIn()返回false。
  • 你使用的Spring Security插件1.2.7.3版本存在默认逻辑:当检测到请求为HTTPS时,会自动给JSESSIONID以及Spring Security相关的认证Cookie加上Secure标识,后续如果跳转到HTTP页面,Cookie无法正常传递,就会出现你遇到的异常。

排查解决步骤

  1. 先确认Tomcat的server.xml中Connector配置,检查是否同时开放了HTTP和HTTPS端口,再确认站点的业务跳转逻辑是否存在跨协议跳转的情况。
  2. 修改Grails项目Config.groovy中的Spring Security配置:
    • 若全站使用HTTPS:显式添加配置grails.plugins.springsecurity.secureCookie = true,同时配置Tomcat或者前置代理将所有HTTP请求强制跳转到HTTPS,避免跨协议访问。
    • 若确实需要同时支持HTTP和HTTPS:显式添加配置grails.plugins.springsecurity.secureCookie = false,关闭自动给Cookie添加Secure标识的逻辑(注意该配置会降低数据传输安全性,非必要不建议使用)。
  3. 额外检查Cookie的domain和path配置,确认不存在跨域名、跨应用上下文路径导致的Cookie丢失问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 14:39:02