Implementación de User Detail Service en Spring Security con MySQL
Clase 13 de 23 • Curso de Java Spring Security: Autenticación y Seguridad Web
Contenido del curso
- 5

Configuración de Seguridad con Spring Security y Basic Authentication
06:32 - 6

Funcionamiento del Basic Authentication Filter en Spring Security
11:50 - 7

Deshabilitar protección CSRF en APIs REST con Spring Security
07:28 - 8

Configuración de CORS en Spring Security para APIs y Frontend
12:11 - 9

Configuración de Reglas de Acceso en Spring Security
07:45 - 10

Creación de usuarios personalizados en Spring Security
07:07 - 11

Creación y Gestión de Roles y Permisos en Aplicaciones Web
05:48
- 12

Creación y Gestión de Usuarios en Base de Datos con Spring Security
04:50 - 13

Implementación de User Detail Service en Spring Security con MySQL
09:21 - 14

Asignación de Roles y Permisos en Spring Security
08:57 - 15

Permisos Específicos con Authorities en Spring Security
13:07 - 16

Seguridad de Métodos en Spring Security: Control de Accesos por Roles
06:19
- 17

Creación y Uso de JSON Web Tokens en Java con Auth0
09:05 - 18

Implementación de Autenticación con JSON Web Tokens en Spring Boot
15:45 - 19

Validación de JSON Web Tokens con Auth0 en Java
06:29 - 20

Creación de Filtro de Seguridad JWT en Spring Security
18:16 - 21

Implementación de JSON Web Token en Spring Security
11:58
¿Cómo implementar un User Detail Service en Spring para MySQL?
Para utilizar MySQL como repositorio de usuarios para autenticación en una aplicación Spring, es crucial implementar un servicio conocido como UserDetailService. Este servicio le indica al Authentication Provider en dónde buscar los usuarios y cómo verificar sus credenciales. Aquí exploraremos los pasos necesarios para configurar adecuadamente este servicio.
¿Crear nuestra propia implementación del UserDetailService?
Lo primero que necesitamos es una clase que implemente el UserDetailService. En el contexto de Spring, esto se logra de la siguiente manera:
- Crea una nueva clase en la capa de servicio llamada
UserSecurityService. - Anota esta clase con
@Servicepara asegurar que entre en el ciclo de vida de Spring. - Implementa la interfaz
UserDetailService.
Implementar esta interfaz nos impone la obligación de definir el método loadUserByUsername, que tiene la lógica para ubicar un usuario en nuestra base de datos MySQL.
@Service
public class UserSecurityService implements UserDetailsService {
private final UserRepository userRepository;
@Autowired
public UserSecurityService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserEntity userEntity = userRepository.findById(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found: " + username));
// Construir un UserDetails usando los valores de userEntity
return User.builder()
.username(userEntity.getUsername())
.password(userEntity.getPassword())
.roles("ADMIN") // Temporalmente se asigna el rol de 'admin'
.accountLocked(userEntity.getLocked())
.disabled(userEntity.getDisable())
.build();
}
}
¿Cómo se configura el repositorio para buscar en MySQL?
Para buscar usuarios en nuestra base de datos MySQL, debemos crear un repositorio. Esto se hace extendiendo de CrudRepository, que nos proporciona funcionalidades básicas de base de datos.
- Define una interfaz
UserRepositoryen el paquete de persistencia. - Haz que esta interfaz extienda
CrudRepositoryusando la entidad de usuario adecuada (UserEntity) y el tipo de su clave primaria (por ejemplo,String).
public interface UserRepository extends CrudRepository<UserEntity, String> {
}
Al emplear CrudRepository, no es necesario definir métodos adicionales de consulta, ya que permite buscar un elemento a través de su clave primaria con métodos predeterminados.
¿Cómo lanzar la aplicación y verificar la configuración?
Una vez configurado el servicio y el repositorio, es esencial lanzar la aplicación y verificar su correcto funcionamiento:
- Asigna roles a los usuarios en la base de datos (por ahora, todos serán 'admin').
- Verifica que los usuarios puedan autenticarse correctamente contra la base de datos utilizando nombres de usuario y contraseñas válidos.
Para probar la autenticación:
- Utiliza credenciales como
CustomeryCustomer123para asegurarte de que el sistema retorna unstatus 200. - Introduce contraseñas incorrectas para verificar que retorna mensajes de error como
401 Unauthorized.
¿Qué sigue después de la implementación?
La implementación de UserDetailService es solo un paso en el robustecimiento de la seguridad de una aplicación. El siguiente paso es crear una tabla de roles separada y asignar permisos más específicos a cada usuario. Esto permitirá una gestión de permisos más flexible y escalable. ¡Te invitamos a seguir aprendiendo y mejorando tus aplicaciones!