2015-06-28 2 views
11

Я пытаюсь использовать ZuulFilter в простейшем прокси-сервере Spring-cloud-Netflix Api (обратный прокси-сервер), чтобы аутентифицировать запросы против пользовательского поставщика проверки подлинности (через вызов Rest).NetflixOSS Zuul Фильтр для отклонения запросов

Фильтр должен отклонять несанкционированные запросы с помощью 401 и не передавать эти запросы дальше до проксированных служб.

Возможно ли это для ZuulFilter? Я не нашел документацию, например, что-то в Zuuls api.

Любые предложения?

ответ

19

Я получил это, чтобы работать, взял некоторый рытье. Убедитесь, что ваш запрос уже не кэширован. Просто вызовите этот метод из метода run() внутри вашего ZuulFilter.

/** 
* Reports an error message given a response body and code. 
* 
* @param body 
* @param code 
*/ 
private void setFailedRequest(String body, int code) { 
    log.debug("Reporting error ({}): {}", code, body); 
    RequestContext ctx = RequestContext.getCurrentContext(); 
    ctx.setResponseStatusCode(code); 
    if (ctx.getResponseBody() == null) { 
     ctx.setResponseBody(body); 
     ctx.setSendZuulResponse(false); 
    } 
} 
+1

Это работает - один простой «ctx.setSendZuulResponse (false)»; отсутствовал в нашем коде :) –

+0

@ thomas-jäckle, Предполагая, что вы вызываете auth-service из предварительного фильтра, как вы получаете тело? Что такое код? –

+0

Тело ответа будет пустым, потому что оно еще не сделало вызов (предварительный фильтр). Вы можете просто установить ctx.setSendZuulResponse (false); для достижения того, что вам нужно. – azdragon2

1

Если вы хотите использовать аутентификацию с помощью Spring Cloud, попробуйте проект Spring Security Cloud.

+0

Да, этот проект имеет некоторые полезные инструменты для использования oauth. Зуул - это, в основном, пустой лист. Spring Cloud Netflix Zuul имеет несколько простых функций маршрутизации и пересылки. Фильтры Zuul предоставляют вам доступ к необработанному HTTP-запросу и ответу, поэтому вы можете делать все, что вам нужно. См. Мой ответ на этот вопрос для начала: http://stackoverflow.com/questions/31055736/creating-custom-zuul-filters – spencergibb

1

Я использую pre фильтр для проверки подлинности запроса, а если запрос дозы не авторизован, то я вернусь 401 и не называю заднюю торцевую службы больше. Я делаю это в run() функции, как это:

RequestContext ctx = getCurrentContext(); 
// do something to check the authentication 
if(auth failed){ 
    ctx.unset(); 
    ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); 
} 

ctx.unset() сказать контекст, чтобы остановить этот запрос, и ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); установить код НТТР 401

также см Netflix Zuul - block request routing

+0

Выполнение ctx.unset() заставляет Zuul исключать. Просто ctx.setSendZuulResponse (false); работает на меня. – icordoba

Смежные вопросы