【问题标题】:Dynamic authentication with Ribbon and @LoadBalanced使用 Ribbon 和 @LoadBalanced 进行动态身份验证
【发布时间】:2018-10-14 21:53:54
【问题描述】:

我有一个微服务,它支持两个用户的 HttpBasic 身份验证,useradmin,具有不同的授权。现在我有一个 Web 应用程序要求登录并将操作委托给第一个微服务。

我这样使用@LoadBalancedRestTemplateBuilder

@LoadBalanced
@Bean
RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder.basicAuthorization("x", "x").build();
}

获得授权/负载平衡的RestTemplate 来访问我的微服务,但这种设计意味着凭据始终是x - x,无论用户密码 用于登录网络应用程序。

我知道我可以使用这样的东西

@Autowired
private RestTemplateBuilder restTemplateBuilder;

public String callSecureService() {
   // ... get principal and password
   RestTemplate restTemplate = restTemplateBuilder.basicAuthorization([user], [password]).build();
   return restTemplate.getForObject("http://localhost:8080/secureAPI",String.class);
}

使用用于登录 Web 应用程序的凭据调用微服务,但我认为这意味着失去功能区的负载平衡功能。

所以,我的问题是,有没有办法同时捕获(负载平衡和动态身份验证)?还是我理解错了,设计不应该是这样的?

(示例代码取自 javadeveloperzone.com1

【问题讨论】:

    标签: java spring-boot load-balancing resttemplate netflix-ribbon


    【解决方案1】:

    好的,感谢here,我得到了解决方案。基本上我们不再使用@LoadBalanced,而是使用LoadBalancerClient 结合RestTemplateBuilder 来为每个请求提供授权。我将在下面留下相关代码。谢谢大家。

    @Autowired
    protected RestTemplateBuilder restTemplateBuilder;
    
    @Autowired
    private LoadBalancerClient loadBalancer;
    
    protected String serviceAlias;
    
    public EmpleadosWebService(String serviceAlias) {
        this.serviceAlias = serviceAlias;
    }
    
    private RestTemplate getRestTemplateWithCurrentAuth() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        return restTemplateBuilder.basicAuthorization(auth.getName(), (String) auth.getCredentials()).build();
    }
    
    private String getBaseUrl() {
        ServiceInstance serviceInstance = loadBalancer.choose(this.serviceAlias);
        // We could log this string to check the load balancing
        return serviceInstance.getUri().toString();
    }
    
    public Empleado getEmpleado(String cif) {
        return getRestTemplateWithCurrentAuth().getForObject(this.getBaseUrl() + "/empleados/{cif}",
                Empleado.class, cif);
    }
    
    ...
    

    还有一件事:要从 Spring 3.1 开始访问凭据(密码),我们需要像这样配置 AuthenticationManagerBuilder

    auth.eraseCredentials(false)
    

    否则凭据将在登录后立即从内存中删除。

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多