Usando Spring Security con autenticación y autorización basada en base de datos

Para una descripción completa sobre todas las opciones que ofrece Spring Security Database Schema podéis ir a su reference guide.

Si lo que queréis es autenticar y autorizar a vuestros usuarios usando una base de datos los pasos son estos:

1) Crear Tablas para usuarios y roles de usuarios:

USERS (MySQL)

ROLES (MySQL)

Scripts:

CREATE TABLE `users` (

`USER_ID` INT(10) UNSIGNED NOT NULL,

`USERNAME` VARCHAR(45) NOT NULL,

`PASSWORD` VARCHAR(45) NOT NULL,

`ENABLED` tinyint(1) NOT NULL,

PRIMARY KEY (`USER_ID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `user_roles` (

`USER_ROLE_ID` INT(10) UNSIGNED NOT NULL,

`USER_ID` INT(10) UNSIGNED NOT NULL,

`AUTHORITY` VARCHAR(45) NOT NULL,

PRIMARY KEY (`USER_ROLE_ID`),

KEY `FK_user_roles` (`USER_ID`),

CONSTRAINT `FK_user_roles` FOREIGN KEY (`USER_ID`) REFERENCES `users` (`USER_ID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2) Introduzco unos cuantos usuarios en mis tablas:

INSERT INTO users (USER_ID, USERNAME,PASSWORD, ENABLED) VALUES (100, ‘user’, ‘123456’, TRUE);

INSERT INTO users (USER_ID, USERNAME,PASSWORD, ENABLED)VALUES (200, ‘admin’, ‘123456’, TRUE);

3) Asigno roles a mis usuarios

INSERT INTO user_roles (USER_ROLE_ID, USER_ID,AUTHORITY) VALUES (1, 100, ‘ROLE_USER’);

INSERT INTO user_roles (USER_ROLE_ID, USER_ID,AUTHORITY) VALUES (1, 200, ‘ROLE_ADMIN’);

4) En mi configuración Spring creo un DataSource con la configuración para mi base de datos de Seguridad

<bean id="dataSource4Security"

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="com.mysql.jdbc.Driver" />

<property name="url" value="jdbc:mysql://localhost:3306/security" />

<property name="username" value="root" />

<property name="password" value="password" />

</bean>

NOTA: Recordad que en entornos productivos no debe usarse el DriverManagerDataSource

5) En la configuración Spring de Spring Security configuro mi AuthenticationManager:

<authentication-manager>

<authentication-provider>

<jdbc-user-service data-source-ref="dataSource"

users-by-username-query="

select username,password, enabled

from users where username=?"

authorities-by-username-query="

select u.username, ur.authority from users u, user_roles ur

where u.user_id = ur.user_id and u.username =? "

/>

</authentication-provider>

</authentication-manager>

Fijaos en las queries que se usan:

Para autenticar: select username,password, enabled from users where username=?

Para autorizar: select u.username, ur.authority from users u, user_roles ur where u.user_id = ur.user_id and u.username =?

6) En la configuración Spring de Spring Security configuro la seguridad sobre mi aplicación Web:

7) Ya puedo ejecutar mi aplicación web:

Respuestas

  1. Hola buen post pero por que mencionas que en entornos productivos no debe usarse el DriverManagerDataSource? cual es la razon? y por cual deberiamos de cambiarlo para que sea productiva la aplicacion

      1. OOOh ya veo, muy bien, muchas gracias por tu apoyo y respuesta pronta saludos!!

Replica a Oscar LG Cancelar la respuesta