2
respostas

COMO FAZER O TRATAMENTO DE ERRO 403 - FORBIDDEN

Boa noite, consegui executar o código conforme o curso e deu certo porém gostaria de saber como tratar o erro 403 nas exceções para retornar uma mensagem ao usuário que ele não tem permissão. ` @EnableWebSecurity @Configuration public class SecurityConfigurations extends WebSecurityConfigurerAdapter {

@Autowired
private AutenticaoService autenticaoService;

@Autowired
private TokenService tokenService;

@Autowired
private UsuarioRepository usuarioRepository;

@Override
@Bean
protected AuthenticationManager authenticationManager() throws Exception {
    return super.authenticationManager();
}

// configurações de autenticação
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(autenticaoService).passwordEncoder(new BCryptPasswordEncoder());
}

// configurações de Autorização
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors();
    http.authorizeRequests()
            .antMatchers(HttpMethod.POST, "/api/usuario").permitAll()
            .antMatchers(HttpMethod.POST, "/api/login").permitAll()
            .anyRequest().authenticated()
            .and().csrf().disable()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().addFilterBefore(new AutenticacaoViaTokenFilter(tokenService, usuarioRepository), UsernamePasswordAuthenticationFilter.class);
}

// configurações de recursos estáticos(js, css, imagens, etc.)
@Override
public void configure(WebSecurity web) throws Exception {
}

`

2 respostas

Oi Avila,

Você precisa adicionar nas configurações de segurança:

.and().addFilterBefore(new AutenticacaoViaTokenFilter(tokenService, usuarioRepository), UsernamePasswordAuthenticationFilter.class)
.exceptionHandling().accessDeniedHandler(new TratamentoErro403());

E criar a classe para tratar o erro:

public class TratamentoErro403 implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest req, HttpServletResponse res, AccessDeniedException ex) throws IOException, ServletException {
        res.setStatus(403);
        res.setContentType("application/json");
        res.getWriter().write("sua mensagem personalizada");
    }
}

bom dia professor mesmo seguindo esse passo a passo continuar retornando apenas o status 403 porém não vem a mensagem

@RestControllerAdvice
public class CustomAccessDeniedHandler implements AccessDeniedHandler {

    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException ex) throws IOException, ServletException {
        response.setStatus(403);
        response.setContentType("application/json");
        response.getWriter().write("Token inválido");

    }
}




// configurações de Autorização
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors();
        http.authorizeRequests()
                .antMatchers(HttpMethod.POST, "/api/usuario").permitAll()
                .antMatchers(HttpMethod.POST, "/api/login").permitAll()
                .anyRequest().authenticated().and().exceptionHandling()
                .and().csrf().disable()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and().addFilterBefore(new AutenticacaoViaTokenFilter(tokenService, usuarioRepository), UsernamePasswordAuthenticationFilter.class)
                .exceptionHandling().accessDeniedHandler(new CustomAccessDeniedHandler());
    }