Динамическая аутентификация с помощью ленты и @LoadBalanced - PullRequest
0 голосов
/ 15 октября 2018

У меня есть микросервис, который поддерживает аутентификацию HttpBasic для двух пользователей, пользователь и admin , с различными полномочиями.Теперь у меня есть веб-приложение, запрашивающее логин и делегирующее операции первому микросервису.

Я использую @LoadBalanced и RestTemplateBuilder таким образом

@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);
}

для вызова микросервиса с учетными данными, используемыми для входа в веб-приложение, ноэто означает потерю возможностей балансировки нагрузки ленты, я думаю.

Итак, мой вопрос, есть ли способ получить обе ловушки (балансировка нагрузки и динамическая аутентификация)?Или я что-то не так понимаю, и дизайн не должен быть таким?

(пример кода взят с javadeveloperzone.com 1 )

1 Ответ

0 голосов
/ 19 октября 2018

Хорошо, я получил решение благодаря здесь .В основном мы больше не используем @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)

, иначе учетные данные будутстирается из памяти сразу после входа в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...