es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué estoy recibiendo un error 403 – prohibido?

Estaba trabajando en un proyecto de Spring Boot Security y autentiqué algunos endpoints para prevenir el acceso de los USUARIOS y otorgué autoridad a ADMIN cada vez que accedí a esta URL: admin/users. Obtuve la página de inicio de sesión, ingresé las credenciales y en lugar de devolver el contenido real, devolvió type=Forbidden, status=403.

Aquí está mi SecurityConfig

 @Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // inyectar la interfaz de detalles del usuario de Spring
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(encoder());
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.authorizeRequests()
                .antMatchers("/api/**", "/").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and().formLogin();
        }

    @Bean
    public BCryptPasswordEncoder encoder(){
        return new BCryptPasswordEncoder();
    }
}

controlador de usuarios de administrador

@RestController
@RequestMapping("admin/users")
public class UserController {

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;

    // obtener todos los usuarios
    @PreAuthorize("hasAnyRole('ADMIN')")
    @GetMapping
    public List<User> getAllUsers(){
        return userRepository.findAll();
    }

    // prueba
    @PreAuthorize("hasAnyRole('ADMIN')")
    @GetMapping("/test")
    public String message() {
        return "punto final protegido";
    }
  
  //crear nuevos usuarios
    @PreAuthorize("hasAnyRole('ADMIN')")
    @PostMapping
    public User registerUser(@RequestBody  User user){

        String password = user.getPassword();
        String encodedPassword = passwordEncoder.encode(password);
        user.setPassword(encodedPassword);
        return userRepository.save(user);
    }
}

userDetail

public class CustomUserDetails implements UserDetails {

    /**
     * 
     */
    private static final long serialVersionUID = 1256711395932122675L;
    private User user;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        return user.getRoles().stream().map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                .collect(Collectors.toList());

    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public boolean isEnabled() {
        // TODO Auto-generated method stub
        return true;
    }

}

userDetailsService

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
      User user = userRepository.findByUsername(username);
      CustomUserDetail userDetail = null;

      if(user != null) {
        userDetail = new CustomUserDetail();
        userDetail.setUser(user);
      }
      else {
          throw new UsernameNotFoundException("El usuario no existe con el nombre de usuario " + username);
      }
        System.out.println("Detalles del usuario" + userDetail);
        return  userDetail;

    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    El problema parece estar relacionado con una autorización insuficiente. El usuario tiene el rol correcto de “ADMIN”, pero no puede acceder al punto final “/admin/users”.

    Una posible solución a este problema es verificar si el rol “ADMIN” tiene los permisos necesarios para acceder al punto final. En este caso, podría ser útil agregar el método “hasAuthority” en lugar de “hasRole” en la configuración de seguridad.

    Otra posible solución es verificar si el usuario está autenticado antes de acceder al punto final. Esto se podría hacer agregando el método “.authenticated()” antes del método “.hasRole” en la configuración de seguridad.

    Por último, podría ser útil verificar si los detalles del usuario, el servicio de usuario y el repositorio de usuario están implementados correctamente y funcionando según lo esperado. Cualquiera de estos problemas podría provocar la aparición del mensaje de error.

Comments are closed.