как пересылать запросы в другой микросервис с помощью Spring? - PullRequest
0 голосов
/ 05 ноября 2019

Мы хотим иметь службу 'auth', использующую Spring Security, которая:

  1. аутентифицирует входящий запрос,
  2. в случае успеха добавляет userid к заголовку http
  3. перенаправляет запрос (с заголовком) в другую службу

Какой самый простой способ добиться такого рода переадресации с помощью Spring?

1 Ответ

1 голос
/ 06 ноября 2019

Для этого случая использования мы можем создать новое приложение Spring Boot (в основном называемое API-шлюзом), которое включает прокси Zuul ( EnableZuulProxy ). Создайте пользовательский фильтр Zuul PRE_TYPE, который анализирует все входящие запросы. Его целью было бы проверить, содержит ли входящий запрос токен, затем вызвать службу аутентификации, получить информацию о вызывающем абоненте и добавить идентификатор пользователя в пользовательский заголовок.

Как только входящий запрос будет пропущен через все фильтры, используйте свойства zuul.routes.* для пересылки запроса соответствующим службам.

Для вызова удаленной службы (в этом случаев случае службы аутентификации) мы можем использовать класс Spring * RemoteTokenServices . И BearerTokenExtractor класс для извлечения токена из входящих запросов. Вот пример кода, с которого можно начать:

@Override
public Object run() {
    final RequestContext requestContext = RequestContext.getCurrentContext();
    final HttpServletRequest request = removeCustomHeaders(requestContext.getRequest());

    requestContext.setRequest(request);

    final Authentication authentication = tokenExtractor.extract(request);

    if (Objects.nonNull(authentication)) {
        try {
            final OAuth2Authentication oAuth2Authentication = tokenServices.loadAuthentication(authentication.getPrincipal().toString());

            final Map<String, String> userAuthDetails = (Map<String, String>) oAuth2Authentication.getUserAuthentication().getDetails();
            requestContext.addZuulRequestHeader(USERNAME_HEADER, oAuth2Authentication.getPrincipal().toString());
            // Add other required information in headers. 
        }
     catch(final AuthenticationException | RestClientException |OAuth2Exception e){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...