Springmvc Security Mysql Users
Springmvc Security Mysql Users
Hasta ahora en nuestra aplicación hemos tenido almacenados los usuarios y roles
en memoria.
Ventajas
Configuración rápida (solo se declaran en el archivo XML).
Adecuada para aplicaciones con pocos usuarios.
Desventajas
Si se declaran más usuarios, es necesario reinciar la aplicación.
No es posible que el usuario pueda cambiar su contraseña.
Spring Security permite recuperar los usuarios y contraseñas en una base de datos
relacional como MySQL (Avanzado).
Ventajas
Se pueden agregar N usuarios en tiempo de ejecución (no es necesario reiniciar Apache Tomcat).
Configuración adecuada para aplicaciones con muchos usuarios.
Se puede crear un formulario (CRUD) para agregar usuarios.
Solo se requieren dos tablas (usuarios y roles).
• Se puede usar la base de datos por defecto.
Podemos crear nuestra propia estructura de la base de datos.
• Ideal para usar nuestras tablas de usuarios de acuerdo al contexto de nuestro proyecto.
• El desarrollador es responsable de escribir las sentencias SQL para estas tablas.
Recuperar usuarios y roles de una Base de datos (MySQL)
Esquema por defecto de la base de datos para Spring Security.
Recuperar usuarios y roles de una Base de datos (MySQL)
Configuración de Spring Security (Datasource)
security.xml
<!-- Autenticacion desde una base de datos -->
<authentication-manager >
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource" />
</authentication-provider>
</authentication-manager>
security.xml
<!--Autenticacion desde una base de datos personalizada -->
<authentication-manager >
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select cuenta,pwd,activo from Usuarios where cuenta = ? "
authorities-by-username-query="select cuenta,perfil from Perfiles where cuenta = ? " />
</authentication-provider>
</authentication-manager>
De esta forma, suponiendo que nuestra base de datos estuviera en poder de usuarios ajenos a
nuestra organización, sería mucho más difícil (casí imposible) conocer las contraseñas de los
usuarios.
Encriptar contraseñas con el algoritmo bcrypt
Spring Security recomienda usar el algoritmo bcrypt para encriptar passwords.
https://docs.spring.io/spring-security/site/docs/current/reference/html/ns-config.html#ns-password-encoder
Ventajas:
Ejecuta un hashing one-way (solo se encripta, pero no se puede desencriptar).
Fácil de configurar en nuestra aplicación web.
Configuración (security.xml)
<authentication-manager >
<authentication-provider>
<password-encoder ref="passwordEncoder"/>
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select cuenta,pwd,activo from Usuarios where cuenta = ? "
authorities-by-username-query="select cuenta,perfil from Perfiles where cuenta = ? " />
</authentication-provider>
</authentication-manager>
¿Cómo encriptar passwords en nuestra webapp?
UsuariosController.java
@Controller
@RequestMapping("/usuarios")
public class UsuariosController {
@Autowired
private BCryptPasswordEncoder encoder;
@GetMapping("/demo-bcrypt")
public String pruebaBcrypt() {
String password = "mari123";
String encriptado = encoder.encode(password);
System.out.println("Password encriptado: " + encriptado);
return "usuarios/demo";
}
}