前言
我正在为 Grails 微服务联合设计一个 API 网关。此问题似乎与已在此存储库中提交的一堆问题有关,但没有提供解决方案。
版本和配置
圣杯:3.2.2
雄猫:8.5
插件版本:
compile 'org.grails.plugins:spring-security-core:3.1.2'
compile "org.grails.plugins:spring-security-rest:2.0.0.M2"
我正在使用 spring security rest 插件仅用于令牌身份验证。我自己通过返回ROLE_NO_ROLES
所有用户来完成授权部分getAuthorities()
。我拦截所有请求并根据我自己存储在数据库中的授权模式授权访问。
问题:
使用这些配置和策略,当我在本地系统上运行我的代码时,它可以按需要运行。当我将它作为 tomcat 中的 war 文件部署在服务器上时,它适用于对网关的所有请求,即所有模式的请求/umm/controller/action
。Spring 安全上下文就在那里,并且完美地评估了用户。
当我尝试使用表单的请求通过重定向调用其他微服务/umm/microservice/controller/action
,springSecurityService.getCurrentUser()
并springSecurityService?.principal?.username
开始返回 null。尽管我的令牌得到了完美的评估,但我没有得到任何安全上下文。
有关详细信息,请查看此问题。上述问题中还提供了重现该错误的详细信息。整个项目可在此处获得。
更新:2017 年 5 月 19 日
我尝试在本地机器上的 Tomcat 中部署我的战争。这个问题和这个问题提供了以下解决方案。
- 禁用tomcat缓存
- 环境
grails.plugin.springsecurity.sch.strategyName = org.springframework.security.core.context.SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
到目前为止似乎没有任何效果。反正SecurityContextHolder
要回来了。null
即所有用户检索功能SpringSecurityService
。getCurrentUser()
, getPrincipal()
,getAuthentication()
并loadCurrentUser()
返回 null。
更新:2017 年 5 月 23 日
为了缩小问题范围,我使用
java -Dgrails.env=prod -jar build/libs/mywar-0.1.war
现在对于任何非 umm 请求,我都会得到一个404, page not found
. 我认为问题出在生产环境上。该应用程序在开发中运行良好。
也试过grails run-app
了,效果很好。为了排除生产环境的问题,我使用创建了战争grails dev war
但无济于事。到目前为止,对war
.
更新:2017 年 5 月 25 日
我可能应该问这个http://security.stackexchange.com但为了记录,我也在这里问。
我在下面提供的答案包含一个解决方法修复。答案中解释了修复工作的机制。我的问题是:
- 这种方法是否会在安全系统中引入任何漏洞或漏洞?
- 这个授权模式是安全的还是需要修改?
- 我正在通过插件进行身份验证,但正在授权自己。有人可以绕过安全过滤器并直接命中授权拦截器吗?因为如果有人能做到这一点,他只需给我一个与令牌格式相同的管理员用户名,他就可以访问所有内容。