我们使用的架构与中描述的架构非常相似spring.io 上的这个很棒的指南 https://spring.io/guides/tutorials/spring-security-and-angular-js/#_the_api_gateway_pattern_angular_js_and_spring_security_part_iv。我们的网关处理身份验证,会话使用 spring-session 存储在 Redis 中。我们的微服务的端点是安全的,并且也使用 spring-session。
在一个微服务中,我需要调用另一个微服务的端点。我可以通过发现客户端轻松获取 URL,但我需要提供凭据,并且不确定实现该目的的最佳方法。
我正在考虑从 HttpRequest 获取 SESSION cookie,将其存储在某种线程局部变量或请求范围 bean 中,然后在 RestTemplate 中使用它来调用第二个微服务。我需要这个请求作用域的 bean,因为 RestTemplate 将在服务层中使用,即不在 MVC 控制器中使用,并且我不想用从 cookie 获取的此会话标识符污染我的服务层方法。
有没有更好的方法来满足这种需求? Spring Cloud 是否已经对此提供了一些支持?
非常感谢您的投入
此时访问Spring Session id最简单的方法是使用RequestContextHolder.getRequestAttributes().getId()
。一旦您有权访问它,您就可以编写自定义的ClientHttpRequestInterceptor
在请求中包含会话 ID:
public SpringSessionClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
throws IOException {
boolean isMyService = ...;
// very important not to send the session id to external services
if(isMyService) {
request.getHeaders().add("x-auth-token", RequestContextHolder.getRequestAttributes().getId());
}
}
}
然后,当您创建 RestTemplate 时,请确保添加SpringSessionClientHttpRequestInterceptor
.
RestTemplate rest = new RestTemplate();
rest.getInterceptors().add(new SpringSessionClientHttpRequestInterceptor());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)