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 :)