Я Zuul в качестве пограничного сервера. поэтому все запросы проходят мимо этого пограничного сервера. У меня есть микросервис A. Все веб-сервисы A защищены базовой аутентификацией. Как мы можем вызвать услуги A b, проходящие через прокси Zuul? Должен ли я добавлять заголовок для сообщений?
Служба базовой аутентификации под названием By Zuul
Ответы (6)
В идеале запрашивающий должен иметь токен в запросе.
Если вы хотите, чтобы Zuul добавил токен аутентификации, вы можете создать ZuulFilter и использовать:
context.addZuulRequestHeader("Authorization", "base64encodedTokenHere");
Это дало бы открытый доступ к сервисам, что может быть неразумно.
Это мой фильтр Zuul:
public class BasicAuthorizationHeaderFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 10;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
ctx.getRequest().getRequestURL();
ctx.addZuulRequestHeader("Authorization", "Basic " + Utils.getBase64Credentials("user", "Token"));
return null;
}
}
Вы можете вызвать (через Zuul) свой сервис A следующим образом:
https://login:[email protected]/serviceA
но сначала разрешите заголовок AUTHORIZATION через Zuul для этой конкретной службы (маршрута) со свойством sensitiveHeaders в вашем файле свойств:
zuul.routes.serviceA.sensitiveHeaders=Cookie,Set-Cookie
или оставьте его пустым, если вы хотите также передать заголовки Cookie.
Подробнее о заголовках через Zuul
Используйте свойство чувствительного заголовка zuul с пустым значением,
zuul.sensitiveHeaders=
Свойство выше поможет, но если вы хотите иметь фильтры для заголовков Cookie, вы можете использовать это свойство со значениями,
zuul.sensitiveHeaders=Cookie,Set-Cookie
Это изменение немного сложно.
@Override
public int filterOrder() {
return 1; // change the return value to more than 5 the above code will work.
}
попробуйте с окончательным кодом ниже:
@Component
public class PreFilter extends ZuulFilter {
private static final Logger LOG = LoggerFactory.getLogger(PreFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 10;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
ctx.addZuulRequestHeader("Authorization", request.getHeader("Authorization"));
return null;
}
}