【发布时间】:2017-10-15 10:43:29
【问题描述】:
序言
我正在为 Grails 微服务联合设计一个 API 网关。这个问题似乎与repository 中已经提交的一系列问题有关,但没有提供解决方案。
版本和配置
Grails:3.2.2
Tomcat: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 插件仅用于令牌身份验证。我自己通过为getAuthorities() 中的所有用户返回ROLE_NO_ROLES 来完成授权部分。我拦截所有请求并根据我自己存储在数据库中的授权模式授权访问。
问题:
通过这些配置和策略,当我在本地系统上运行我的代码时,它可以按需要运行。当我将它作为 tomcat 中的 war 文件部署在服务器上时,它适用于对网关的所有请求,即模式 /umm/controller/action 的所有请求。 Spring 安全上下文就在那里,并且完美地评估了用户。
当我尝试使用 /umm/microservice/controller/action、springSecurityService.getCurrentUser() 和 springSecurityService?.principal?.username 形式的请求通过重定向调用其他微服务时,开始返回 null。尽管我的令牌得到了完美的评估,但我没有得到任何安全上下文。
有关详细信息,请查看此issue。上述问题中还提供了重现该错误的详细信息。 整个项目可用here。
更新:2017 年 5 月 19 日
我尝试在本地机器上的 Tomcat 中部署我的战争。这个question 和这个question 提供以下解决方案。
- 禁用 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,但无济于事。到目前为止,war 没有任何效果。
更新:2017 年 5 月 25 日
我可能应该问这个http://security.stackexchange.com,但为了记录,我也在这里问。
下面我提供的答案包含一个解决方法。答案中解释了修复工作的机制。我的问题是:
- 这种方法是否会在安全系统中引入任何漏洞或漏洞?
- 此授权模式是否安全或需要修改?
- 我正在通过插件进行身份验证,但正在授权自己。有人可以绕过安全过滤器并直接命中授权拦截器吗?因为如果有人能做到这一点,他只需给我一个与令牌格式相同的管理员用户名,他就可以访问所有内容。
【问题讨论】:
标签: spring-security tomcat8 grails3 spring-security-rest