Search code examples
springspring-bootjwthttp-status-code-403http-status-code-401

SC_UNAUTHORIZED returns 403 in Spring Boot


I have the following JWT filter

public class JwtRequestFilter extends OncePerRequestFilter {

    @Autowired
    private MyUserDetailsService userDetailsService;

    @Autowired
    private JwtUtil jwtUtil;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException, MalformedJwtException {

        final String authorizationHeader = request.getHeader("Authorization");

        String username = null;
        String jwt = null;

        try {
            if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
                jwt = authorizationHeader.substring(7);
                username = jwtUtil.extractUsername(jwt);
            }
        } catch (MalformedJwtException e) {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        }

        ...

        chain.doFilter(request, response);
    }

But for some reason, I still get a 403 response instead of 401.

{
   "timestamp": "2020-07-08T15:59:50.696+0000",
   "status": 403,
   "error": "Forbidden",
   "message": "Access Denied",
   "path": "/ping"
}

Any idea what might be the issue? I tried different returns but they are all either 500 or 403.


Solution

    • Since you are handling the response directly, you will have to do something like this
        StringBuilder sb = new StringBuilder();
        sb.append("{ ");
        sb.append("\"error\": \"Unauthorized\" ");
        sb.append("\"message\": \"Unauthorized\"");
        sb.append("\"path\": \"")
          .append(request.getRequestURL())
          .append("\"");
        sb.append("} ");
    
        response.setContentType("application/json");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);  
        response.getWriter().write(sb.toString());
        return;