【问题标题】:How to consume basic-authentication protected Restful web service via REACTIVE feign client如何通过 REACTIVE feign 客户端使用受基本身份验证保护的 Restful Web 服务
【发布时间】:2020-03-09 22:55:02
【问题描述】:
@ReactiveFeignClient(name = "service.b",configuration = CustomConfiguration.class)
public interface FeingConfiguration {

    @PostMapping("/api/students/special")
    public Flux<Student> getAllStudents(@RequestBody Flux<SubjectStudent> lista);

}

帮助,如何向我在服务中的标头添加基本身份验证:service.b。 我有 CustomConfiguration.class 类但它不允许我,我有 401 授权失败

@Configuration
public class CustomConfiguration {

    @Bean
    public BasicAuthRequestInterceptor basic() {
        return  new BasicAuthRequestInterceptor("user","user") ;
    }

【问题讨论】:

    标签: spring-boot security spring-webflux spring-cloud-feign


    【解决方案1】:

    看起来您正在尝试使用 feign-reactive (https://github.com/Playtika/feign-reactive) 来实现您的 REST 客户端。我也将它用于我的一个项目,看起来这个库没有一种开箱即用的方式来指定基本的身份验证凭据。至少没有办法以声明的方式做到这一点。所以我没有找到比通过 @ReactiveFeignClient 放弃自动配置并开始手动配置响应式 feign 客户端更好的方法。这样,您可以手动将“授权”标头添加到所有传出请求。因此,提供此客户端定义:

    public interface FeingClient {
    
        @PostMapping("/api/students/special")
        public Flux<Student> getAllStudents(@RequestBody Flux<SubjectStudent> lista);
    
    }
    

    将以下配置类添加到您的 Spring 上下文中,将用户名、密码和服务 URL 替换为您自己的数据:

    @Configuration
    public class FeignClientConfiguration {
        
        @Bean
        FeignClient feignClient() {
            WebReactiveFeign
                .<FeignClient>builder()
                .addRequestInterceptor(request -> {
                    request.headers().put(
                        "Authorization", 
                         Collections.singletonList(
                            "Basic " + Base64.getEncoder().encodeToString( 
                                "username:password".getBytes(StandardCharsets.ISO_8859_1))));
                    return request;
                })
                .target(FeignClient.class, "service-url");
        }
    }
    

    请注意,用于手动配置响应式 feign 客户端的 API 在不同版本的响应式 feign 库之间可能会有所不同。另请注意,这种方法有一个主要缺点 - 如果您开始手动为您的 feign 客户端创建 bean,您将失去 Feign 的主要优势 - 只需几行代码即可以声明方式编写 REST 客户端。例如。如果您想将上述客户端与某种客户端负载平衡机制一起使用,例如 Ribbon/Eureka 或 Ribbon/Kubernetes,您还需要手动配置。

    【讨论】:

      【解决方案2】:

      你可以使用直接拦截器:

      @Configuration
      class FeignClientConfiguration {
          @Bean
          fun reactiveHttpRequestInterceptor(): ReactiveHttpRequestInterceptor {
              return ReactiveHttpRequestInterceptor { request: ReactiveHttpRequest ->
                  request.headers()["Authorization"] = //insert data from SecurityContextHolder;
                  Mono.just(request)
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-29
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-11
        相关资源
        最近更新 更多