我构建了一个 Spring 身份验证微服务,负责对每个 REST 请求进行身份验证。身份验证机制是使用 JWT 构建的。每个请求都应提供一个 Authentication: Bearer
header 。
我还构建了一个网关微服务,公开了后端微服务的一些 API。对网关的每个请求都应该经过身份验证。我正在考虑实现一个 OncePerRequestFilter
,从中我可以调用身份验证微服务。
@Component
public class AuthFilter extends OncePerRequestFilter {
@Autowired
private RestTemplate restTemplate;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
// User restTemplate to call the authentication microservice and authenticate the request.
}
}
我的问题可能有点太宽泛,但我还是想尝试一下。
在 Spring 过滤器内发出 HTTP 请求是否存在任何问题?这是否会导致挂起或某些边缘情况下的任何问题,或者这只是一个糟糕的设计?
最佳答案
可以在 Filter 内调用外部服务。 Spring Security 也经常在各种情况下执行此操作(例如,针对 LDAP 进行身份验证、获取 JWK 来验证 JWT 签名等)。它可能不会直接在过滤器内部调用外部服务,但过滤器将委托(delegate)给其他对象来调用外部服务。但想法是一样的,只要确保你处理了外部服务不可用的情况,比如在调用外部服务时对 HTTP 请求设置合理的超时时间。如果超时后无法收到外部服务的响应,则视为失败。
附注看起来您正在实现自己的授权流程。如果您的身份验证服务支持 OAuth2 ,您可以考虑尝试 Spring Security 5 的 OAuth2 支持,这可能会让您的生活更轻松。
关于spring - 在过滤器内调用另一个 Spring 微服务是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59430155/