【问题标题】:Securing each microservices保护每个微服务
【发布时间】:2025-11-27 14:30:01
【问题描述】:

我有两个微服务,它们应该相互通信。 我的例子:微服务 A 向微服务 B 发出请求。用户不应该有访问权限,只有其他微服务。我想,那个解决方案可能是“Http Basic Authentication”,所以微服务A也应该将用户名和密码发送给微服务B。那很好,但是微服务A应该如何找到那个用户名和密码呢?我正在使用 Eureka 作为发现服务,但我没有找到任何可以帮助我的情况。我只找到了 eureka.client.proxy-user-name 和 eureka.client.proxy-password,但对我没有用。

【问题讨论】:

  • 您在哪里部署微服务?你在使用 Kubernetes/Openshift 吗?
  • @nitgeek 我是云开发新手,所以目前我没有部署它。
  • 如果您要部署到 Kubernetes,则秘密用于存储凭据。 kubernetes.io/docs/concepts/configuration/secret
  • 您将使用具有身份验证功能的网关服务,而不是所有微服务。所以 MS-A 将通过网关与 MS-B 通信。

标签: spring-boot spring-security microservices spring-cloud netflix-eureka


【解决方案1】:
  1. 从请求中提取授权标头到微服务 A 中添加该标头 HTTP Header 并向微服务 B 发出请求。Spring Security 将验证 header 并允许身份验证

    private WebClient client = null;
    
    @PostConstruct
    public void init() {
        client = WebClient.builder().baseUrl("some-url").build();
    }
    
    @GetMapping("/getCandidateById/{institutionId}/{id}")
    public Mono<Candidate> getCandidateById(@PathVariable String institutionId, @PathVariable String id, ServerHttpRequest request) {
            return client.get()
                    .uri("/getCandidateById/{institutionId}/{id}", institutionId, id)
                    /*main logic*/.header("Authorization", request.getHeaders().getFirst("Authorization"))
                    .retrieve()
                    .bodyToMono(Candidate.class);
    }
    

我正在提取标头并将其添加到我由 WebClient 发出的请求中。 同样,您也可以使用 RestTemplate。

注意:我使用了基本身份验证

【讨论】: