Аутентификация для доступа к весенним загрузочным маршрутам Zuul Service

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

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

Благодарю.

1 ответ

Решение

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

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

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;
    }

}
Другие вопросы по тегам