Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

[Duda] Configurar la Seguridad de nuestra API

Hola buen día, tengo una consulta, para poder aplicar en nuestra API

@Secured("ROLE_ADMIN")

la unica forma seria agregar a nuestra tabla 'usuarios' los roles de: ROLE_ADMIN; ROLE_USER etc. ? Sin haber creado previamente una clase enum con dichos roles. De otra forma nuestra API solo nos indica 403 Forbidden.

2 respuestas

¡Hola Christian, espero que estés bien!

Entiendo tu duda. En realidad, no es necesario agregar los roles directamente en la tabla 'usuarios' si no quieres crear una clase enum con dichos roles. Puedes configurar la seguridad de tu API utilizando anotaciones como @Secured en los métodos que requieren roles específicos, tal como se muestra en el ejemplo que compartiste.

Sin embargo, para que las anotaciones de seguridad funcionen, es importante habilitar la característica de seguridad del método en la clase Securityconfigurations del proyecto, como se indica en la documentación de Spring Security que compartiste. Al agregar la anotación @EnableMethodSecurity(securedEnabled = true), estarás habilitando el uso de anotaciones de seguridad del método en tu proyecto.

Espero que esta información te sea útil para configurar la seguridad de tu API. ¡Si tienes alguna otra pregunta, no dudes en preguntar!

Espero haber ayudado y buenos estudios!

Hola buen día, te muestro como lo trate de hacer:

@PostMapping()
    @Secured("ROLE_ADMIN")
    public ResponseEntity<DoctorResponseData> registerDoctor(@RequestBody @Valid MedicalRecordData medicalRecordData,
                                                             UriComponentsBuilder uriComponentsBuilder) {
        Doctor doctor = new Doctor(medicalRecordData);
        
        doctor = repository.save(doctor);

                DoctorResponseData doctorResponseData = new DoctorResponseData(
                doctor.getId(),
                doctor.getName(),
                doctor.getEmail(),
                doctor.getPhone(),
                doctor.getDocument(), 
                new DataAddress(doctor.getAddress().getStreet(), doctor.getAddress().getDistrict(),
                        doctor.getAddress().getCity(), doctor.getAddress().getNumber(),
                        doctor.getAddress().getAddition()));  
        final Boolean active = doctor.getActive(); 

             URI url = uriComponentsBuilder.path("/api/v1/doctors/{id}").buildAndExpand(doctor.getId()).toUri();
     
        return ResponseEntity.created(url).body(doctorResponseData);
    }

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true)
public class SecurityConfiguration {

    private final SecurityFilter securityFilter;

    public SecurityConfiguration(SecurityFilter securityFilter) {
        this.securityFilter = securityFilter;
    }
@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http.csrf(csrf -> csrf.disable())
                .sessionManagement(session -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers(HttpMethod.POST, "/login").permitAll() 
                        .requestMatchers(HttpMethod.POST, "/api/v1/doctors").hasRole("ADMIN") 
                        .requestMatchers(HttpMethod.PUT, "/api/v1/doctors/{id}").hasRole("ADMIN") 
                        .requestMatchers(HttpMethod.DELETE, "/api/v1/doctors/{id}").hasRole("ADMIN") 
                        .requestMatchers(HttpMethod.GET, "/api/v1/doctors").hasAnyRole("ADMIN", "USER") 
                        .anyRequest().authenticated()) // Cualquier otra solicitud requiere autenticación
                .addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }
    
    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration)
            throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
    

Imagen Consola

Imagen Postman

Imagen Postman

Si le suprimo: //@Secured("ROLE_ADMIN") a mi Controller, si carga los datos....