Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Acesso Negado

Prezados, boa noite!

Conseguem me ajudar por gentileza?

No meu projeto, bloqueei algumas requisições de acesso ao usuário comum, sendo necessário logar com admin.

Bloqueei a exclusão de médicos e pacientes pelo SecurityConfigurations:

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf(csrf -> csrf.disable())
                .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(req -> req
                    .requestMatchers(HttpMethod.POST, "/login").permitAll()
                    .requestMatchers( "/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**").permitAll()
                    .requestMatchers(HttpMethod.DELETE, "/medicos/**").hasRole("ADMIN")
                    .requestMatchers(HttpMethod.DELETE, "/pacientes/**").hasRole("ADMIN")
                    .anyRequest().authenticated()
                )
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }

E alguns métodos com a anotação:

@Secured("ROLE_ADMIN")

Obs.: Essa anotação foi colocada no método cadastrar do MedicoController.

Porém, ao tentar realizar a classe de teste para o MedicoController, mesmo com a anotação @WithMockUser, recebo acesso negado.

MockHttpServletResponse:
           Status = 403
    Error message = null
          Headers = [Content-Type:"text/plain;charset=UTF-8", Content-Length:"13", X-Content-Type-Options:"nosniff", X-XSS-Protection:"0", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
     Content type = text/plain;charset=UTF-8
             Body = Acesso negado
    Forwarded URL = null
   Redirected URL = null
          Cookies = []
          
Expected :201
Actual   :403

Realizei um teste excluindo a anotação @Secured("ROLE_ADMIN") do método e o teste passou normalmente.

Desta forma, acredito estar recebendo esse erro (acesso negado) por conta disso. Como fazemos para dizer ao Spring que é necessário um usuário admin? Ou como podemos informar isso no método de teste?

1 resposta
solução!

Oi!

A anotação @WithMockUser tem o atributo roles que você pode passar roles específico para o usuário mockado no teste.