sábado, 20 de agosto de 2011

DEMO SPRING SECURITY 3.0.3 [BASE DE DATOS] + MVC

Hola en esta oportunidad hablare un poco sobre el tema: 'Spring Security' específicamente amarrado no a la memoria sino en BD. En si Spring Security es un subproyecto del framework Spring, que nos brinda una facilidad para gestionar la seguridad de nuestras aplicaciones Java J2EE. Las ventajas que nos brinda este Framework son:

- Seguridad a nivel de URL.
- Seguridad a nivel de BD (ROLES, GRUPOS).
- Facilidad para separar la lógica de nuestras aplicaciones del control de la seguridad, utilizando filtros.
- Seguridad a nivel de Interfaz mediante Security Tags.


En la demo preparada vamos a ver, con un ejemplo que muestra la configuración de Spring Security para controlar el acceso a los recursos de una aplicación, por medio de la asignación de grupos de usuarios a nivel de Base de Datos, los cuales se podrán modificar desde dicha base de datos. También, la forma de cómo controlar lo mostrado por Spring Security por medio de la Interfaz. También, parte del demo esta basado en Spring MVN en lo relacionado a la navegación del aplicativo.

El Script preparado esta adaptado a MySQL, pero se podría también ser adaptado a otros motores de datos como ORACLE, SQL SERVER, etc. Lo que si deben manejar las mismas tablas con los mismos nombres, campos, amarres y referencias. Dicho Script se encuentra en la ruta:

DemoSpringSecurity_MVC\src\main\resources\Script\ScriptSpringSecurity.sql

Las características del demo preparado son: Esta basado en JAVA J2EE y consta del manejo de las siguientes tecnologías y herramientas:

- Spring Suite v2.5
- SPRING SECURITY 3.0.3
- SPRING 3.0.3
- SPRING MVC 3.0.3
- MAVEN 2.2
- MySQL 5.0
- JSP 1.2 ( con XHTML 1.0)
- Include.
- JSTL 1.2
- etc


Cabe recalcar el manejo de los Tags importantes que posee Spring Security en dicho demo los cuales son:

- [security:authentication property="principal.username" /] = Permite el la visualización del usuario logueado en el sistema.

-[a href="[c:url value="/j_spring_security_logout" /]" ] = Permite ejecutar un Link para cerrar la sesión de Spring Security.

- [security:authorize ifAllGranted] = Aplicado al usuario con todos los roles.
- [security:authorize ifAnyGranted] = Aplicado al usuario con algún rol especifico.
- [security:authorize ifNotGranted] = Aplicado al usuario con sin ningún tipo de rol.

Dentro del archivo: spring-security.xml, para poder trabajar con BD se debe de realizar la configuración siguiente:

[!-- **** SEGURIDAD: 'MANAGER DE AUTENTICACION' **** --]
[security:authentication-manager alias="authenticationManager" ]
[security:authentication-provider user-service-ref="userService" /]
[/security:authentication-manager]

[!-- **** BEAN 'JDBCDAOIMPL' **** --]
[beans:bean id="userService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl" ]
[beans:property name="dataSource" ref="seguridadDataSource" /]
[beans:property name="enableGroups" value="true" /]
[beans:property name="enableAuthorities" value="false" /]
[/beans:bean]

[!-- **** BEAN 'DATASOURCE' **** --]
[beans:bean id="seguridadDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" ]
[beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /]
[beans:property name="url" value="jdbc:mysql://localhost:3306/DB_SPRING_SECURITY" /]
[beans:property name="username" value="root" /]
[beans:property name="password" value="root" /]
[/beans:bean]


En esta configuración lo resaltante es justamente la selección de las dos formas de trabajo con BD:

[beans:property name="enableGroups" value="true" /] = Para habilitar el manejo a nivel de GRUPOS.

[beans:property name="enableAuthorities" value="false" /] = Para habilitar el manejo a nivel de ROLES.


Por otro lado los GRUPOS conocidos son:
- ROLE_ADMIN: Grupo de Administradores.
- ROLE_USER: Grupo de Usuarios.

Pero se pueden registrar en BD otros grupos en mi caso registre:

- ROLE_SUPERVISOR = Grupo de Supervisores.

Y se configuran en: spring-security.xml.

Las tablas de BD utilizadas de forma STANDAR son:

- USERS
- GROUPS
- GROUP_MEMBERS
- AUTHORITIES
- GROUP_AUTHORITIES


Luego de su configuración se puede probar este Query para ver los amarres respectivos:

SELECT U.USERNAME, U.PASSWORD, U.ENABLED,
GA.AUTHORITY, GM.GROUP_ID
FROM USERS U,
GROUP_AUTHORITIES GA,
GROUP_MEMBERS GM
WHERE U.USERNAME = GM.USERNAME
AND GA.GROUP_ID = GM.GROUP_ID;


La Navegación y redireccionamiento se puede controlado desde el mismo archivo de configuración: spring-security.xml, o hacerle referencia a una clase controladora (que es la forma que en este caso estamos controlado), llamada:

DemoSpringSecurity_MVC\src\main\java\org\java\security\controller\LoginController.java


La Configuración de Privilegios Inicial 'Por GRUPO' aplicada es:

I. RGUERRA:
1- - GRUPO: [ ROLE_ADMIN ]
2- - ESTADO: [ ACTIVADO ]
3- - PROVILEGIO: [ listado, informacion ]

II. RLOZA:
1- - GRUPO: [ ROLE_USER ]
2- - ESTADO: [ ACTIVADO ]
3- - PROVILEGIO: [ listado, informacion ]

III. CCOTRINA:
1- - GRUPO: [ ROLE_SUPERVISOR ]
2- - ESTADO: [ ACTIVADO ]
3- - PROVILEGIO: [ listado ]


El 'NO ACCESO' de algún sitio debido a 'PRIVILEGIOS', redireccionara de forma AUTOMÁTICA a: [accesoRestringido] .

0. Validación Login:

1.Login [RGuerra]:

2.MenuPrincipal [RGuerra]:

3.Listado [RGuerra]:

4.Informacion [RGuerra]:

1.Login [RLoza]:

2.MenuPrincipal [RLoza]:

3.Informacion [RLoza]:

4.Informacion [RLoza]:

1.Login [CCotrina]:

2.MenuPrincipal [CCotrina]:

3.Listado [CCotrina]:

4.Informacion [CCotrina_Protegida]:

Si se activa la configuración deshabilitada para el Grupo: ROLE_SUPERVISOR se mostrara:

5.Informacion [CCotrina]:


Para descargar el demo completo pulsar Aquí

Saludos.

11 comentarios:

fabian andres dijo...

hay algun tutorial en donde se este basando este ejemplo pues esta interesante y no comprendo algunas cosas del mismo

Cristhian dijo...

PUEDES PONER QUE CAMPOS VAN EN LA BD PUES PONES LAS TABLAS PERO EN SI QUE CAMPOS SON..! PORQUE EN MI CASO SOLO TENGO USUARIOS Y TIPO DE USUARIOS..!
GRACIAS

Cristhian dijo...

jajaja sorry brother ahi estaba en el ejemplo gracias de antemano sos groso..! como decimos aca en Perú..!

JAVAMAN dijo...

Sorry por la demora. Dentro del POST esta todo el detalle de BD y campos.

Sobre de donde me base, de diferentes POST doc y Links propios de Spring. Lo que quise en si es mostrar un ejemplo completo y no tan básico como la mayoría de tutos que encontré.

Saludos

cesar aguirre dijo...

MUy Buen Post... Gracias...

Edgar ZM dijo...

Muchas gracias este tutorial es de los mas completos que se pueden encontrar en la red. quiza lo unico que faltaria es la utilizacion de filtros y el passwordencoder jeje pero bueno creo que tambien nos toca algo de chamba a nosotros que estamos empezando :)

JAVAMAN dijo...

Eso mismo doc, la cosa es ayudarlos a entender por medio de un ejemplo real.. y entendible !. Saludos.

Dani dijo...

Hola,
los campos y las tablas han de ser las mismas o se puede configurar y donde ?? Graciass

JAVAMAN dijo...

Las tablas y los campos tengo entendido que tienen que ser las mismas. Hay scripts por motor de datos.

Fernando dijo...

Muy buen post hace mucho rato buscaba esta guia gracias. Ahora, me genera este error, que aun no he podido saber a que se debe.... Añguien mas a tenido este problema??

deploy?DEFAULT=C:\PROJECT\JAVA\DemoSpringSecurity_MVC\target\SpringMVC&name=org.java.security.controller_DemoSpringSecurity_MVC_war_1.0&contextroot=/DemoSpringSecurity_MVC&force=true failed on GlassFish Server 3.1.1
Error durante la implementación: Excepción al implementar la aplicación [org.java.security.controller_DemoSpringSecurity_MVC_war_1.0] : There is no web component by the name of default here.. Consulte /server.log para obtener más información.

Anónimo dijo...

Saludos, estoy probando tu aplicacion y me sale este error u.u ..
porfavor tu ayuda...EH ESTADO INVESTIGANDO ESTE ERROR, PERO NO EH PODIDO SOLUCIONARLO.

Grave: Exception starting filter springSecurityFilterChain
java.lang.ClassCastException: org.springframework.web.filter.DelegatingFilterProxy cannot be cast to javax.servlet.Filter