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

[Sugestão] Solução - Aula 5 - Controle de acesso, Parte 12. Para saber mais: controle de acesso por url

Ao tentar implementar o código disponibilizado na parte 12, mesmo que os usuários não possuam a ROLE_ADMIN o código permite que os médicos sejam deletados.

Para quem tiver dúvidas de como solucionar o problema, será necessário alterar incluir * ao final das urls: "/medicos" e "/pacientes".

O código corrigido ficaria assim para quem está utilizando a mesma versão do spring das aulas:

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

E o código ficaria assim para quem está utilizando as versões mais recentes do spring:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {
    return httpSecurity
            .csrf(AbstractHttpConfigurer::disable)
            .sessionManagement(httpSecuritySessionManagementConfigurer -> httpSecuritySessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> {
                authorizationManagerRequestMatcherRegistry.requestMatchers("/login").permitAll();
                authorizationManagerRequestMatcherRegistry.requestMatchers(HttpMethod.DELETE, "/medicos/*").hasRole("ADMIN");
                authorizationManagerRequestMatcherRegistry.requestMatchers(HttpMethod.DELETE, "/pacientes/*").hasRole("ADMIN");
                authorizationManagerRequestMatcherRegistry.anyRequest().authenticated();
            })
            .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
            .build();
}

Bônus:

Para quem deseja testar a exclusão de médicos e pacientes usando o filtro de ADMIN, a forma mais simples seria incluir a role de admin na classe Usuário, método getAuthorities:

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return List.of(new SimpleGrantedAuthority("ROLE_USER"),new SimpleGrantedAuthority("ROLE_ADMIN"));
}

Espero que essa resposta possa ajudar outros colegas :)

1 resposta
solução!

Oi Alexandre,

Excelente observação e obrigado por compartilhar a solução! 👍

Sua sugestão de como implementar o filtro de ADMIN na classe Usuário também é muito útil, pois facilita os testes. 💪

Sua contribuição ajuda muito a comunidade, continue assim! 🤔

Veja mais: Documentação oficial do Spring Security