我有两个弹簧引导进程。我在这两个平台上都启用了Spring Security,并且我使用了Spring Security OAuth2 SSO设置。我还使用Eureka和Zuul允许进入Boot1的呼叫在Boot2中调用服务。 UI正在将Angular与REST调用一起使用到服务中,并且使用的令牌是Json Web令牌。其余的调用需要JSESSIONID(Spring引导,Spring安全,OAuth2,Zuul)
这一切似乎工作,当然在用户界面。所有请求都使用Authorization头(包含JWT)和服务中的spring安全筛选器成功解析JWT并从中提取安全性上下文。作为Spring Web处理的一部分,它为客户端的cookie添加了JSESSIONID值。
最近,我在Boot1上只有Spring安全性。当将休息服务调用到Boot1中(最终使用Zuul将请求转发到Boot2)时,剩余客户机中所需的所有内容都包括授权标头和JWT,并且一切正常。
但是,我最近在Boot2中添加了Spring Security(使用@EnableResourceServer批注),现在除非我拥有Authorization标头以及包含JSESSIONID值的Cookie标头,否则其余调用将失败。调用不会失败,但会返回空值。
我已经启用了日志记录到Spring Security,并且它在Boot1中正确验证了所有内容。它将进入相同的ZuulFilter。但Boot2上没有任何活动。
Zuul中是否有某些东西需要定义JSESSIONID值才能转发请求?或者是在Boot2中,由于引入了Spring Security过滤器,它期望JSESSIONID标头值?
---更新---
我已经步入boot1。从我所看到的,OAuth2TokenRelayFilter中的代码抛出异常。具体而言,getAccessToken方法正在调用引发UserRedirectRequiredException的restTemplate.getAccessToken()。getValue(第90行,版本1.1.0-RELEASE)。
所以,虽然TokenRelayFilter有一个令牌,但它试图刷新它。当它收到一个异常时,它会抛出一个BadCredentialsException而不是使用已经定义的内容。
---更新2 ---
请辞OAuth2RestOperationsConfiguration断点,使其余的通话,而JSESSIONID总是要创建一个新的DefaultOAuth2ClientContext结束了,因为它试图创建会话范围豆。使用JSESSIONID,它使用持久的DefaultOAuth2ClientContext,它将拥有上下文。
那么,构建DefaultOAuth2ClientContext时是否有可能查看请求是否包含令牌并使用它?或者类似的东西?我们正试图转向无国界的服务,这似乎是一个障碍。
您的Angular UI如何获得您的Oauth2服务器发布的JWT令牌,以及它如何在使用Angularjs $ http时呈现给Boot2应用程序?我提出了一个相关教程项目的问题。 https://github.com/spring-guides/tut-spring-security-and-angular-js/issues/114 –
我想要实现的功能 - UI App - 一个@ EnableSSO应用,一旦通过身份验证就可以完成$ http调用启动[n]应用程序是@ EnableResourceServer - 使用JWT令牌进行身份验证。不使用zuul代理(一旦我处理了交叉来源) –
客户端UI在登录后调用Spring的/用户端点来获取有关用户的详细信息。其中包括智威汤逊。对Rest端点的所有后续调用均将JWT作为HTTP标头“授权”的一部分。对于我们而言,我们希望使用Zuul代理,因为它可以减少应用程序上的攻击向量。但是,既然我们在这两个进程上都具有安全性,那么无论我们最终在javascript中调用哪个资源服务器,它都可以工作。 – EdH