【问题标题】:How to consume basic-authentication protected Restful web service via feign client如何通过 feign 客户端使用基本身份验证保护的 Restful Web 服务
【发布时间】:2017-01-29 03:00:02
【问题描述】:

感谢您的宝贵时间。 为简单起见,我创建了如下示例服务:

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

    @GetMapping("/add")
    public int add(@RequestParam("left") int left, @RequestParam("right") int right) {
        return left + right;
    }
}

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

management.security.enabled=true
security.user.name=admin
security.user.password=admin

当我启动此服务并像这样访问时:

GET /add?left=100&right=11 HTTP/1.1
Authorization: ***** Hidden credentials *****
Host: localhost:7777
Connection: close

一切都很好。

在其他节点中,我通过 netflix feign 创建了一个“服务消费者”。这是一个 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);
}

但我不知道如何配置请求头“授权”。

有什么想法吗?再次感谢。

【问题讨论】:

标签: spring-security spring-cloud spring-cloud-netflix


【解决方案1】:

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

import feign.auth.BasicAuthRequestInterceptor;

@Configuration
public class FeignClientConfiguration {
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
         return new BasicAuthRequestInterceptor("admin", "admin");
    }
}

然后在你的@FeignClient注解中使用这个配置文件:

@FeignClient(name="service", configuration = FeignClientConfiguration.class)

【讨论】:

  • 在此处使用 @Configuration 会导致此 bean 应用于 all @FeignClient 并且您不需要 configuration = 部分。如果您删除 @Configuration,则此 bean 将被忽略,configuration = 部分不执行任何操作。
  • 正确的方法(如果你只希望在一个特定的@FeignClient 上使用它)是添加@Configuration,然后使用excludeFilters@ComponentScan 中排除它
  • 如果configuration 属性不与@FeignClient 一起使用,为什么它会应用于所有人。
  • @Ravik 因为它被组件扫描拾取。对于那些对此感到困惑的人(就像我一样)阅读documentation
  • 谢谢,这对我有用。一条评论,小心,使用feign.auth.BasicAuthRequestInterceptor,而不是org.springframework.http.client.support.BasicAuthenticationInterceptor...
【解决方案2】:

截至 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();
}

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

【讨论】:

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