como vou conseguir deletar com o INSTRUTOR se ele não está mapeando, no resposta do mão na massa está igual
como vou conseguir deletar com o INSTRUTOR se ele não está mapeando, no resposta do mão na massa está igual
Ola!
O ponto principal é: existem duas camadas de validação no seu projeto:
Na sua configuração você tem, por exemplo:
req.requestMatchers(HttpMethod.DELETE, "/topicos/**").hasRole("ESTUDANTE");
Ou seja:
➡Só ESTUDANTE pode chegar até o endpoint DELETE
Então um INSTRUTOR nem chega no método — o Spring bloqueia antes.
Lá dentro você tem isso:
if(hierarquiaService.usuarioNaoTemPermissoes(logado, autor, "ROLE_MODERADOR"))
Essa regra diz:
Se for autor OU tiver papel maior (ex: MODERADOR) pode executar
O problema é:
Então o fluxo fica assim:
| Perfil | Chega no controller? | Pode executar regra? |
|---|---|---|
| ESTUDANTE | Sim | Sim (se autor) |
| INSTRUTOR | Não | — |
| MODERADOR | Não | — |
Você precisa alinhar o Security com o Service.
Se a regra é:
Então o endpoint deveria permitir ambos:
req.requestMatchers(HttpMethod.DELETE, "/topicos/**")
.hasAnyRole("ESTUDANTE", "MODERADOR");
Depende da regra do exercício:
Para respostas, o enunciado diz:
estudantes e instrutores excluem e alteram somente respostas que tenham criado
Então nesse caso você deve permitir:
req.requestMatchers(HttpMethod.DELETE, "/topicos/*/respostas/**")
.hasAnyRole("ESTUDANTE", "INSTRUTOR", "MODERADOR");
E deixar o controle fino no Service.
Você não está conseguindo deletar com INSTRUTOR porque:
➡O Spring Security nem deixa ele entrar na rota
➡ A validação do Service nunca é executada