spring - 在过滤器内调用另一个 Spring 微服务是否正确?

标签 spring filter microservices

我构建了一个 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/

相关文章:

Spring-MVC 3.1 : How to map URLs with a trailing slash?

arrays - 在 Google 表格中将 2D 范围转换为带有空格的 1D 数组

java - Java中复杂的数据驱动的Web应用程序-技术决策

java - GIT 分支可以有数据子集吗?

asp.net - 重写 ASP.NET 输出时为 "Invalid use of response filter"

java - java api中脚本评分与函数评分过滤器的结合

ssl - 使用 https 和 TLS 保护 Kubernetes 集群中的内部服务通信

asp.net-core - API 网关 Ocelot 和 Kubernetes

go - 没有 Docker 的 Traefik v2 反向代理

javascript - 如何调用将文件上传到露天