Как передать исключение JwtFilter в ответ JSON сервера? - PullRequest
2 голосов
/ 06 ноября 2019

Мой JwtFilter:

 public class JWTAuthorizationFilter extends BasicAuthenticationFilter {

    public JWTAuthorizationFilter(AuthenticationManager authManager) {
        super(authManager);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest req,
                                    HttpServletResponse res,
                                    FilterChain chain) throws IOException, ServletException {
        String header = req.getHeader("Authorization");

        if (header == null || !header.startsWith("Bearer ")) {
            chain.doFilter(req, res);
            return;
        }

        UsernamePasswordAuthenticationToken authentication = getAuthentication(req);

        SecurityContextHolder.getContext().setAuthentication(authentication);
        chain.doFilter(req, res);
    }

    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
        String token = request.getHeader("Authorization");
        if (token != null) {
            // parse the token.


            byte[] keyBytes = Decoders.BASE64.decode("kaslsafdhlkjsdfhlksjdafhlaksjdfhlaskajdhflaksdaf87687687asdafasdhfasdfsdfdfjalskjfhlaskdhflasdjhl3434");
            Key key = Keys.hmacShaKeyFor(keyBytes);

            String cleanToken = token.replace("Bearer ", "");
            String user = Jwts.parser().setSigningKey(key).parseClaimsJws(cleanToken).getBody().getSubject();

            if (user != null) {
                return new UsernamePasswordAuthenticationToken(user, null, new ArrayList<>());
            }
            return null;
        }
        return null;
    }
}

И он выдает «Подпись JWT не соответствует локально вычисленной подписи. Подлинность JWT не может быть подтверждена и ей нельзя доверять». исключение.

Я пытаюсь поймать его с помощью authenticationEntryPoint(new JwtAuthenticationEntryPoint()):

    @Component("restAuthenticationEntryPoint")
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {

    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authenticationException) throws IOException, ServletException {

        response.setContentType("application/json");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        response.getOutputStream().println("{ \"error\": \"" + authenticationException.getMessage() + "\" }");

    }

}

Но я получаю:

{
    "error": "Full authentication is required to access this resource"
}

Как получить исключения из фильтров и перейти на httpответ?

1 Ответ

0 голосов
/ 06 ноября 2019

Наконец я нашел ответ. В фильтре я изменяю ответ:

try {
    UsernamePasswordAuthenticationToken authentication = getAuthentication(req);

    SecurityContextHolder.getContext().setAuthentication(authentication);
    chain.doFilter(req, res);
}catch (Exception e){


    res.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
    res.getWriter().write(convertObjectToJson(e));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...