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无法正常传递,就会出现你遇到的异常。
排查解决步骤
- 先确认Tomcat的
server.xml中Connector配置,检查是否同时开放了HTTP和HTTPS端口,再确认站点的业务跳转逻辑是否存在跨协议跳转的情况。 - 修改Grails项目
Config.groovy中的Spring Security配置:- 若全站使用HTTPS:显式添加配置
grails.plugins.springsecurity.secureCookie = true,同时配置Tomcat或者前置代理将所有HTTP请求强制跳转到HTTPS,避免跨协议访问。 - 若确实需要同时支持HTTP和HTTPS:显式添加配置
grails.plugins.springsecurity.secureCookie = false,关闭自动给Cookie添加Secure标识的逻辑(注意该配置会降低数据传输安全性,非必要不建议使用)。
- 若全站使用HTTPS:显式添加配置
- 额外检查Cookie的
domain和path配置,确认不存在跨域名、跨应用上下文路径导致的Cookie丢失问题。
内容的提问来源于stack exchange,提问作者arash yousefi
相关产品推荐
相关产品推荐

