5
respostas

Como liberar requisição para perfil especifico?

Eu realizei uma configuração para liberar o "/actuator" somente para o perfil de ADMIN, porem não funcionou.

Segue configuração:

Debugando essa classe e possível verificar que o "usuario.getAuthorities()" consegue recuperar o perfil ADMIN que esta no banco.

Classe AutenticacaoViaTokenFilter.java:

private void autenticarCliente(String token) {
        Long idUsuario = tokenService.getIdUsuario(token);
        Usuario usuario = usuarioR.findById(idUsuario).get();

        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(usuario, null, usuario.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(authentication);
    }

Classe SecurityConfiguration.java:

// Configura as Autorizacoes
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
        .antMatchers(HttpMethod.POST, "/auth").permitAll()
        .antMatchers(HttpMethod.GET, "/actuator/**").hasAnyRole("ADMIN")
        .anyRequest().authenticated()
        .and().csrf().disable()
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and().addFilterBefore(new AutenticacaoViaTokenFilter(tokenService,usuarioR), UsernamePasswordAuthenticationFilter.class);

    }

Banco de dados

Usuario:

'1', 'admin@admin', 'admin', '$2a$10$fD.5D0bneBqUjorJ4vps5uAN5wxjsH8qU9mx2ALM/EFUqH98iosgW'

Perfil

'1','ADMIN'

Usuario_Perfil:

'1', '1'

Estou recebendo 403 quando faço a requisição. Tem algum outro ponto que posso verificar?

5 respostas

Oi Cesar,

Talvez seja porque sua regra foi adicionada apenas para url /actuator/**, sendo assim ele vai liberar urls como /actuator/info, /actuator/health, etc.

Mas não vai liberar o /actuator em si.

Altere seu código para:

.antMatchers(HttpMethod.GET, "/actuator").hasRole("ADMIN")
.antMatchers(HttpMethod.GET, "/actuator/**").hasRole("ADMIN")

E veja se funciona.

Fiz 3 testes.

Usando as duas linhas

.antMatchers(HttpMethod.GET, "/actuator").hasRole("ADMIN")
.antMatchers(HttpMethod.GET, "/actuator/**").hasRole("ADMIN")

nesse cenário o "/actuator" e "/actuator/qualquercoisa" não funcionam, sempre retorna 403.

Usando somente a linha

.antMatchers(HttpMethod.GET, "/actuator/**").hasRole("ADMIN")

O resultado é o mesmo do anterior com duas linhas.

Ja usando somente a linha

.antMatchers(HttpMethod.GET, "/actuator").hasRole("ADMIN")

O "/actuator" não funciona, mas o "/actuator/qualquercoisa" funciona normalmente.

Estranho não ter funcionado. Deve ser alguma configuração que não estamos enxergando :D

Você consegue disponibilizar seu projeto para eu dar uma olhadinha? Pode ser via GitHub ou Google Drive.

https://github.com/CesarAugusto-ls/webapi

Oi Cesar,

Dei uma olhada e aparentemente não vi problemas no código.

Tenta também liberar o actuator para o role admin via propriedade no application.properties:

management.security.roles=ADMIN

Pois por padrão o Spring Security cria para o actuator um role chamado ROLE_ACTUATOR.

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