如何通过假装客户端使用基本身份验证保护的Restful Web服务

Zhu*_*ING 11 spring-security spring-cloud spring-cloud-netflix

感谢您的时间.为简单起见,我创建了一个示例服务,如下所示:

@RestController
@RequestMapping("/")
public class ComputeController {

    @GetMapping("/add")
    public int add(@RequestParam("left") int left, @RequestParam("right") int right) {
        return left + right;
    }
}
Run Code Online (Sandbox Code Playgroud)

为了保护这个URL,我像这样配置spring-security:

management.security.enabled=true
security.user.name=admin
security.user.password=admin
Run Code Online (Sandbox Code Playgroud)

当我启动此服务并访问如下:

GET /add?left=100&right=11 HTTP/1.1
Authorization: ***** Hidden credentials *****
Host: localhost:7777
Connection: close
Run Code Online (Sandbox Code Playgroud)

这一切都很顺利.

在其他节点中,我通过netflix feign创建了一个"service-comsumer".这是一个Java接口.

@FeignClient(name = "API-GATEWAY", path = "/compute-service", fallback = ComputeServiceCircuitBreaker.class)
public interface ComputeServiceClient {

    @RequestMapping(path = "/add", method = RequestMethod.GET)
    public Integer add(@RequestParam("left") Integer left, @RequestParam("right") Integer right);
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何配置请求标题"授权".

任何的想法?再次感谢.

Jua*_*o G 27

例如,您需要创建一个FeignClient配置类

import feign.auth.BasicAuthRequestInterceptor;

@Configuration
public class FeignClientConfiguration {
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
         return new BasicAuthRequestInterceptor("admin", "admin");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在@FeignClient注释中使用此配置文件

@FeignClient(name="service",configuration = FeignClientConfiguration.class)
Run Code Online (Sandbox Code Playgroud)

继续尝试,希望它有所帮助

感谢Ryan Baxter 的纠正

  • 在这里使用 `@Configuration` 会导致这个 bean 被应用到 *all* `@FeignClient` 并且你不需要 `configuration =` 部分。如果你移除 `@Configuration`,那么这个 bean 将被忽略,并且 `configuration =` 部分什么都不做。 (4认同)
  • 执行此操作的正确方法(如果您只想在一个特定的“@FeignClient”上使用)是添加“@Configuration”,然后使用“excludeFilters”将其从“@ComponentScan”中排除 (3认同)
  • 谢谢,这对我有用。一条评论,小心,使用`feign.auth.BasicAuthRequestInterceptor`,而不是`org.springframework.http.client.support.BasicAuthenticationInterceptor`... (3认同)
  • @Ravik,因为它是通过组件扫描拾取的。对于那些对此感到困惑的人(就像我一样)请阅读[文档](https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html#spring-cloud-feign-overriding-defaults ) (2认同)

小智 16

截至 2020 年 10 月,此方法有效:

public class FeignClientConfiguration {

    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        return new BasicAuthRequestInterceptor("asdf", "asdf");
    }
}


@FeignClient(name = "thirdPartyClient", url = "ceva.com",
        configuration = FeignClientConfiguration.class)
public interface ThirdPartyClient {

    @GetMapping
    Response get();
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们不会使用 @Configuration 注释配置,以免将其应用于所有请求。