¿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;
}
}
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.