Feign Client - заголовок динамической авторизации
У меня есть сервис, который получает HTTP-запрос с заголовком авторизации. При обработке запроса я хочу использовать Feign Client для запроса другого сервиса. Запрос к другому сервису должен включать тот же заголовок авторизации.
В настоящее время я использую фильтр, чтобы извлечь заголовок авторизации из входящего запроса, сохранить заголовок в ThreadLocal. При сборке Feign Client я использую RequestInterceptor, чтобы прочитать заголовок авторизации из ThreadLocal и поместить его в запрос к другому сервису.
Этот подход не идеален, потому что когда я начинаю использовать такие вещи, как RxJava или Hystrix, потоки меняются при обработке запроса, и мне приходится перемещать заголовок авторизации ThreadLocal из одного потока в другой.
Какие есть другие варианты решения этой проблемы? Один из способов, о котором я думаю, - это создание нового FeignClient для каждого запроса. Таким образом, мне больше не нужно будет хранить авторизацию в локальном потоке. Но разве это хорошая идея?
1 ответ
Я думаю, что нашел решение для моей проблемы. С помощью RequestContextHolder
Я могу получить ссылку на исходный запрос (также из порожденных дочерних потоков) и скопировать оттуда заголовок:
public class AuthForwardInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
template.header(HttpHeaders.AUTHORIZATION, request.getHeader(HttpHeaders.AUTHORIZATION));
}
}