2016-08-10 2 views
1

Я создаю API с использованием Spring Boot. Я установил фильтр проверки подлинности, чтобы захватить токен из заголовка запроса и аутентифицировать его. Если пользователь не может быть найден с использованием токена, генерируется исключение InvalidWSUserException.Spring boot @ExceptionHandler не улавливает соответствующее исключение

Я создал класс для хранения ряда @ExceptionHandlers, чтобы я мог поймать InvalidWSUserException и ответить строкой JSON, сообщающей запрашивающему клиенту, что токен в их запросе был недействительным.

У меня было это работа над другим проектом, но я, похоже, не могу заставить его работать в этом новом проекте.

Исключить InvalidWSUserException, поскольку обработчик должен обрабатывать ответ;

public class InvalidWSUserException extends RuntimeException { 
} 

Я определил класс обработчика как таковой;

@ControllerAdvice 
public class ExceptionController { 

    @ExceptionHandler(value=InvalidWSUserException.class) 
    public ResponseEntity invalidWSUserException(InvalidWSUserException exception) { 
     return new WSResponse().send(HttpStatus.UNAUTHORIZED, "Invalid token."); 
    } 

} 

У меня была проблема в предыдущем проекте, где класс, который бросает исключение не было реализованным к весне через Bean, но я проверил этот класс, и класс, который возводит исключение создается с помощью @Autowired аннотации.

Я пытаюсь понять, почему @ExceptionHandler не делает то, что я думаю, что это должно.

Чтобы подтвердить вывод, я вижу в браузере ошибку 500 json; где, как это должно быть EntityResponse от @ExceptionHandler

{ 
    "timestamp": 1470833849289, 
    "status": 500, 
    "error": "Internal Server Error", 
    "exception": "digital.sheppard.exceptions.InvalidWSUserException", 
    "message": "No message available", 
    "path": "/api/product" 
} 

ответ

-1

Я работаю с JSON Web Token for Java библиотеки, и, как вы выразились выше, у меня была такая же ошибка в службе аутентификации. Я пробовал с @ControllerAdvice, но не имел решения.

После долгого исследования я нашел решение. Вы должны реализовать JwtFilter, и, вместо того, чтобы запускать исключение, вы должны изменить ваше значение HttpServletResponse для того, чтобы добавить следующее:

if (authHeader == null || !authHeader.startsWith("Bearer ")) { 
    //throw new UnauthorizedErrorException(UnauthorizedErrorException.ErrorCodes.INVALID_TOKEN); 

    response.addHeader("Content-Type", "application/json"); 
    response.getWriter().print(getErrorJson());  
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 

    return; 
} 

final String token = authHeader.substring(7); 

try { 
    final Claims claims = Jwts.parser().setSigningKey("secretkey").parseClaimsJws(token).getBody(); 
    request.setAttribute("claims", claims); 
} catch (final SignatureException e) { 
    //throw new UnauthorizedErrorException(UnauthorizedErrorException.ErrorCodes.INVALID_TOKEN); 

    response.addHeader("Content-Type", "application/json"); 
    response.getWriter().print(getErrorJson());   
    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 

    return; 
} 

chain.doFilter(req, res); 

Как вы можете видеть, я прокомментировал запуск исключение и я измените его для переопределения заголовка ответа. getErrorJson() возвращает значение JSON в виде строки (или вы можете поместить только строку как свое тело).

Я надеюсь, что это сработает для вас.

P.D .: Я следую этому instructions, чтобы реализовать auth.

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