我正在为Grails微服务联盟设计API网关。此问题似乎与此repository中已提交的一系列问题有关,但没有提供解决方案。
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()
中的所有用户返回/umm/controller/action
来自行完成授权部分。我拦截所有请求并根据我自己在DB中存储的授权模式授权访问。
使用这些配置和策略,当我在本地系统上运行时,我的代码可以正常工作。当我在服务器上将其作为war文件部署在tomcat中时,它适用于对网关的所有请求,即对于模式/umm/microservice/controller/action
的所有请求。 Spring安全上下文就在那里,用户得到了完美的评估。
当我尝试通过表单springSecurityService.getCurrentUser()
的请求重定向来调用其他微服务时,springSecurityService?.principal?.username
和
grails.plugin.springsecurity.sch.strategyName = org.springframework.security.core.context.SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
开始返回null。虽然我的令牌得到了完美的评估,但我没有获得任何安全上下文。
有关详细信息,请查看此issue 。上述问题中还提供了复制错误的详细信息。 整个项目可用here。
我尝试在本地计算机上的Tomcat中部署我的战争。此question和此question提供了以下解决方案。
SecurityContextHolder
到目前为止似乎没有任何作用。无论如何,null
正在返回SpringSecurityService
。所有用户检索getCurrentUser()
即函数。 getPrincipal()
,getAuthentication()
,loadCurrentUser()
和java -Dgrails.env=prod -jar build/libs/mywar-0.1.war
返回null。
为了缩小问题范围,我使用
执行了独立战争404, page not found
现在,对于任何非umm请求,我都会得到grails run-app
。 我认为问题出在生产环境上。该应用程序在开发过程中完全正常。
还试过grails dev war
,效果很好。为了排除生产环境的问题,我使用war
创建了战争,但无济于事。到目前为止,DECLARE @Frequency NVARCHAR(4);
SELECT @Frequency = 'Test';
IF @Frequency = "Test"
PRINT 'Yes';
没有任何作用。
我应该问这个http://security.stackexchange.com但是为了记录,我也在这里问。
我在下面提供的答案包含一个解决方法修复程序。答案中解释了修复工作的机制。我的问题是:
答案 0 :(得分:1)
我得到了解决问题的解决方法。由于我只需要用户名,因此我在拦截器中抓取了其余的令牌,对其进行了解码并从中提取了用户名。
这里是:
def extractUsername(def token){
Base64 coder = new Base64()
def tok = token - "Bearer "
def principal = tok.tokenize(".")
def dec = coder.decode(principal[1])
def sub = new String(dec)
def user = sub.tokenize(",")
def username=user[1].tokenize(":")
username = username[1]-"\""
return username-"\""
}
它对我有用,因为我不需要检查springSecurityService.Principal
对象。如果是这样的话,我就无法获得用户名。 springSecurityService.Principal
和springSecurityService.getCurrentUser()
仍然返回null。该问题尚未解决。我回答是因为尽管有赏金,我还是没有得到任何评论。 如果有人能解释为什么spring-security-plugin的表现如此,那么对原始问题的回答仍然是受欢迎的。
我使用的解决方法基于令牌的结构以及用户名嵌入在令牌中且令牌只是base64编码的事实。
这是由spring的Spring安全REST插件生成的原始令牌:
eyJhbGciOiJIUzI1NiJ9.eyJwcmluY2lwYWwiOiJINHNJQUFBQUFBQUFBSlZTUDBcL2JRQlJcL0RrRkJpbWdCcVpVNjBLVjBxeHlKanBsSVNwRXFLNmthc2xDcDZHSVwvM0lQem5iazdrMlNwTXBXQkFVU0xWSld2d0RlQmhROVF0VU5YNXE1OVp3aE91eUJ1c2ZYdTU5K1wvNTdNcm1EWWFYc2FhY1dIOFZHUXhsNzVKTlpleHdURFQzQTc5ektDTzBPYUl0UnpZcFFsY0g2OEVYZ0FsSGxsWUNMYlpIcXNKSnVOYXU3ZU5vYTBQTkN3ckhkOHdibW1XWUZcL3BIZitXTzFRYVwveEVvcUwzdkphaHN3RHdMUTVWSjIxSnlkWkJ5amRFR3pCV3pRSVU3YnZRb3BCdVVsak5oSnFFVmxLd25NQXFneWpMN1VaRXFSMlBoNGJYWnpISlI2NkN0QnpDVE1tUEkzWDlKT3RaWmRcL2ZPcHFRRXVcL0FKeW9QVW8wUGRQWGRRM1wvSDRUU1VFcGVaS21xV3VURlRFdDdnVEpcLzdSNHZIbDRlbW9Xd0tnVGw3Y1wvVTB4ZjlLQTBmbUhQMFwvem9yM1F3dU1KNndXc1Brakp6WHpCdks3UktmXC80OXZiTHlkWCsreWxTZG9qWDk5XC9IMHNwTmM4T21TbEttbVZVVE95TGFmdG05RTNuamJ2THhGb1oraHllcFFQcWpwTVhvVnFJZ3ByaGxyY1M0Ynd1ejc5ckI2bWFydmVtZUhUZXBzQ2poOGxXRHBCXC9reWQzS1wvRURSd2c1K0gxMGNQdnRKTkc5Z2VvK0pES240dVFMVXlwSWU2czluSjR2VnI3OE84aGpqWFwvb3Z4RG9UU3hZREFBQT0iLCJzdWIiOiJhZG1pbkRCIiwicm9sZXMiOlsiUk9MRV9OT19ST0xFUyJdLCJleHAiOjE0OTU3MTU3OTMsImlhdCI6MTQ5NTcx MjE5M30.MPEXURGhJo5s75LfUSm5ckG99Byc7FCLyj1gYZJu1zk
这是解码版本:
"主":" H4sIAAAAAAAAAJVSP0 / bQBR / DkFBimgBqZU60KV0qxyJjplISpEqK6kaslCp6GI / 3IPznbk7k2SpMpWBAUSLVJWvwDeBhQ9QtUNX5q59ZwhOuyBusfXu59 + / 57MrmDYaXsaacWH8VGQxl75JNZexwTDT3A79zKCO0OaItRzYpQlcH68EXgAlHllYCLbZHqsJJuNau7eNoa0PNCwrHd8wbmmWYF / PHF + WO1Qa / xEoqL3vJahswDwLQ5VJ21JydZByjdEGzBWzQIU7bvQopBuUljNhJqEVlKwnMAqgyjL7UZEqR2Ph4bXZzHJR66CtBzCTMmPI3X9JOtZZd / fOpqQEu / AJyoPUo0PdPXdQ3 / H4TSUEpeZKmqWuTFTEt7gTJ / 7R4vHl4emoWwKgTl7c / U0xf9KA0fmHP0 / zor3QwuMJ6wWsPkjJzXzBvK7RKf / 49vbLydX ++ ylSdojX99 / H0spNc8OmSlKmmVUTOyLaftm9E3njbvLxFoZ + hyepQPqjpMXoVqIgprhlrcS4bwuz79rB6marvemeHTepsCjh8lWDpB / kyd3K / EDRwg5 + H10cPvtJNG9geo + JDKn4uQLUypIe6s9nJ4vVr78O8hjjX / ovxDoTSxYDAAA =",的"子":" adminDB" 下,"作用&#34 ;:[" ROLE_NO_ROLES&#34],"&EXP#34;:1495715793," IAT":1495712193
此处的主体已签名并加密,但用户名未加密。因此,可以通过上面给出的代码轻松提取它。