Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Tratar retorno exception Spring Security

Como tratar o retorno padrão quando negado o acesso ao path (403 - Forbidden)

{
    "timestamp": "2020-03-20T18:53:02.869+0000",
    "status": 403,
    "error": "Forbidden",
    "message": "Access Denied",
    "path": "/rest/api/v1/brasileirao/times/50"
}

Estou utilizando um GlobalExceptionHandler para tratar todos os erros de forma padrão devolvendo dentro de um mesmo objeto:

{
    "httpCode": 404,
    "httpMessage": "Not Found",
    "moreInformation": "Time com id: 50, não foi encontrado!"
}

Como consigo capturar exceptions relacionadas ao spring security?

2 respostas

Oi Gabriel,

Acho que pode ser via ExceptionHandler mesmo:

@ExceptionHandler(AccessDeniedException.class)
public ResponseEntity<Object> handleAccessDeniedException(Exception e, WebRequest request) {
    return new ResponseEntity<Object>("Acesso negado!", HttpStatus.FORBIDDEN);
}

Bons estudos!

solução!

Boa tarde Rodrigo!

Aparentemente o tratamento acontece antes da execução da aplicação, assim o handler não consegue capturar a exception. O que fiz para resolver foi o seguinte:

  1. Criei uma classe personalizada implementando a interface AuthenticationEntryPoint:

    public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
    
     @Override
     public void commence(HttpServletRequest req, HttpServletResponse res, AuthenticationException authException) throws IOException, ServletException {
         res.setContentType("application/json;charset=UTF-8");
         res.setStatus(403);
    
         ObjectMapper mapper = new ObjectMapper();
         res.getWriter().write(mapper.writeValueAsString(new Error(403,"Forbidden","Acesso Negado!")
         ));
     }
    }
  2. Declarei um bean AuthenticationEntryPoint retornando a classe personalizada criada na classe que se extende de WebSecurityConfigurerAdapter:

    @Bean
     public AuthenticationEntryPoint authenticationEntryPoint(){
         return new CustomAuthenticationEntryPoint();
     }
  3. E inclui dentro do método configure o exceptionHandling():

    //Configuracoes de autorizacao
     @Override
     protected void configure(HttpSecurity http) throws Exception {
         http.authorizeRequests()
                 .antMatchers(HttpMethod.GET, "/rest/api/v1/brasileirao/times").permitAll()
                 .antMatchers(HttpMethod.POST, "/auth").permitAll()
                 .anyRequest().authenticated()
                 .and().exceptionHandling().authenticationEntryPoint(authenticationEntryPoint())
                 .and().csrf().disable()
                 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                 .and().addFilterBefore(new AutenticacaoViaTokenFilter(tokenService, loginRepository), UsernamePasswordAuthenticationFilter.class);
     }

    Segue link de auxilio: https://stackoverflow.com/questions/48306302/spring-security-creating-403-access-denied-custom-response

Obrigado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software