Quero capturar a exceção de acesso negado do Spring Boot quando, por exemplo, um usuário estiver prestes a acessar uma página de um administrador.
Eu tenho esse manipulador de exceção no meu GlobalExceptionHandler (@ControllerAdvice)
@ExceptionHandler(AccessDeniedException.class)
@ResponseStatus(HttpStatus.FORBIDDEN)
public String handleAccessDenied(AccessDeniedException e, Model model) {
model.addAttribute("errorMessage", e.getMessage());
return "error";
}
Tentei usar um CustomAccessDeniedHandler:
@Component
public class CustomAccessDeniedHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {
throw accessDeniedException;
}
}
e no meu SecurityConfig adicionei isso ao meu filterChain:
.exceptionHandling(eh -> eh.accessDeniedHandler(customAccessDeniedHandler))
E agora recebo um acesso negado no meu terminal: org.springframework.security.authorization.AuthorizationDeniedException: Acesso negado
Quero capturar isso com meu GlobalExceptionHandler (tentei usar AuthorizationDeniedException em ExceptionHandler)
Nota: Eu não uso JWT
O que estou perdendo?
O Spring Security lança
AccessDeniedException
,FilterSecurityInterceptor
antes que a solicitação chegue a qualquer controlador, então@ControllerAdvice
não consegue capturá-la.Em vez disso, você pode tentar lidar com isso dentro do
AccessDeniedHandler
. No seu código, a exceção está sendo gerada novamente, então ela não é capturada em lugar nenhum.Tente alterar o manipulador para fazer algo assim:
Em seguida, adicione um controlador para manipular
/access-denied
:Dessa forma, você pode mostrar uma página de erro personalizada com sua mensagem.