Аутентификация для доступа к маршрутам Spring boot Zuul Service

Я настроил свои микросервисы с помощью сервисов Spring boot zuul и eureka. Теперь мне нужно аутентифицировать все маршруты / вызовы REST API. Я имею в виду, что для всех API-интерфейсов клиент отправляет один токен доступа. В службе zuul перед маршрутизацией к конкретной службе я должен вызвать микрослужбу (службу аутентификации) с помощью accessToken, и эта служба аутентификации проверит, существует ли пользователь для отправленного токена доступа. Если accessToken действителен, тогда должна выполняться только маршрутизация.

Пожалуйста, помогите мне реализовать это с помощью службы весенней загрузки.

Спасибо.


person Krish    schedule 04.08.2017    source источник
comment
Разве ваш accessToken не является подписанным токеном, которому вы можете доверять?   -  person Tom Van Rossom    schedule 08.08.2017
comment
Spring-security - способ сделать это правильно. Вы должны делать это вообще только в том случае, если знаете, что вызывающий абонент не может просто обойти ваш прокси и напрямую обратиться к микросервису.   -  person Andy Brown    schedule 10.08.2017
comment
@ Энди Браун, не могли бы вы предоставить подробности или ссылку для проверки?   -  person Krish    schedule 12.08.2017


Ответы (1)


Вам нужно написать фильтр. Фильтр zuul pre - это то, что вам нужно. Вы можете получить доступ к своему серверу аутентификации в фильтре, и если токен недействителен, вы не вызываете свой микросервис и немедленно возвращаете ответ. Если он действителен, вы позволяете запросу перейти к микросервисам.

Пример класса фильтра:

public class AuthFilter extends ZuulFilter {

    @Autowired
    RestTemplate restTemplate;

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        //get your token from request context and send it to auth service via rest template
        boolean validToken = restTemplate.exchange(or getForObject or other methods of restTemplate which you find suitable for method and return type of your auth service controller method)
        if(!validToken) {
            ctx.setSendZuulResponse(false); //This makes request not forwarding to micro services
            ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
            ValidationResponse validationResponse = new ValidationResponse();
            validationResponse.setSuccess(false);
            validationResponse.setMessage("Invalid Access...");
            ObjectMapper mapper = new ObjectMapper();
            String responseBody = mapper.writeValueAsString(validationResponse);
            ctx.setResponseBody(validationResponse);
            ctx.getResponse().setContentType("application/json");
            //If you want to do any thing else like logging etc, you can do it.
        }
        return null;
    }

}
person barbakini    schedule 08.08.2017
comment
Спасибо за ваш ответ. Я могу задать ответ в виде строки. ctx.setResponseBody (Недействительный доступ ...!); Мне нужно установить тело ответа как настраиваемый объект, например ValidationResponse. ValidationResponse - это мой уникальный объект ответа для всех служб. Примерно так: validationResponse.setSuccess (false); validationResponse.setMessage (Недействительный доступ ...); А затем установите этот validationResponse как объект ответа. Не могли бы вы помочь с этим ?? - person Krish; 08.08.2017
comment
@Krishna, без проблем, нужно только задать requestContext responseBody. Я обновил ответ (я установил тип содержимого json. Если вы используете xml, вы можете соответствующим образом установить тип содержимого) - person barbakini; 08.08.2017
comment
Нет, com.netflix.zuul.context.RequestContext.setResponseBody () поддерживает только тип данных String. - person Krish; 08.08.2017
comment
@Krishna Извини, я забыл сказать, что тебе нужно преобразовать свой объект. Добавляю сразу. В своем проекте я использовал com.fasterxml.jackson.databind.ObjectMapper. Вы можете использовать другой, если хотите. Уловка здесь заключается в настройке типа содержимого и соответствующем преобразовании вашего объекта. - person barbakini; 08.08.2017
comment
Спасибо. Он работает для application / json, как и ожидалось. Но не работает для application / xml. Ниже приведена проверка: String responseBody = mapper.writeValueAsString (validationResponse); ctx.setResponseBody (responseBody); если (request.getContentType (). equalsIgnoreCase (приложение / json)) {ctx.getResponse (). setContentType (приложение / json); } если (request.getContentType (). equalsIgnoreCase (приложение / xml)) {ctx.getResponse (). setContentType (приложение / xml); } он всегда дает строку json. Подскажите пожалуйста как обрабатывать для xml ?? - person Krish; 08.08.2017
comment
@Krishna Вы должны использовать XmlMapper для преобразования. XmlMapper.writeValueAsString (yourObject) Может потребоваться добавить зависимость для XmlMapper. ‹Dependency› ‹groupId› com.fasterxml.jackson.dataformat ‹/groupId› ‹artifactId› jackson-dataformat-xml ‹/artifactId› ‹version› 2.7.4 ‹/version› ‹/dependency› - person barbakini; 08.08.2017
comment
XmlMapper у меня не работал. Вместо этого я использовал JAXBContext и отлично с ним работал. Большое спасибо за вашу помощь в этом. - person Krish; 08.08.2017