Mostrando entradas con la etiqueta SPRING MVC. Mostrar todas las entradas
Mostrando entradas con la etiqueta SPRING MVC. Mostrar todas las entradas

jueves, 17 de septiembre de 2015

'SERVER SENT EVENTs' (SSE) con 'SPRING MVC' y 'REST'

'Server Sent Events' (SSE) es una tecnología web desde el navegador que recibe actualizaciones automáticas de un servidor a través del protocolo HTTP, en el cual el cliente (Interfaz web) envía una solicitud y el servidor tiene una conexión hasta que un nuevo mensaje está completado, luego, envía el mensaje de vuelta al cliente mientras se mantiene la conexión abierta de modo que pueda ser utilizado para otro mensaje una vez que esté disponible. Una vez que un nuevo mensaje esté completado, se envía la respuesta al cliente desde la misma conexión inicial (NO se generan multiples conexiones). Posteriormente, la aplicacion cliente debe tener un mecanismo para la recepción multiple de los mensajes (eventos), que serán constantemente enviados desde el servidor de forma individual, sin cerrar la conexión después de procesar cada mensaje.

Una de las aplicaciones de SSE es realizada para la implementación a nivel de SOA del patrón ''UI MEDIATOR'', que recomienda como solución la colocación de un mediador entre el servicio que el usuario ejecuta y el punto final del servicio, tal como lo muestra la imagen:

 

Es importante mencionar el 'SSE' actualmente está soportado por las ultims versiones de: CHROME, FIREFOX y OPERA, pero tengo entendido que SAFARI a la fecha aún no lo soporta.

Para completar esta idea se ha preparado dummy (la parte del Backend), desarrollado en SPRING MVC con REST(JSON), que cumple con el rol de 'Mediador', la idea es que una 'interfaze usuario' (NO implementada) envíe una solicitud al 'Servicio Mediador' (REST), este internamente y en paralelo simulará el consumo de otros servicios (esto incurrirá en tiempos distintos por c/u) y ante la recepción de los response de cada servicio del flujo, retornará eventos en JSON hacia la interface usuario.

La clase: 'SSEControlImpl.java', será la encargada de exponer los REST, y por medio de los objetos: 'SseEmitter' y 'ResponseBodyEmitter', se agregarán y responderá los eventos JSON por etapas:



La clase 'EAIProxyServiceImpl.java', será la encargada de la simulación (hardcode) de los 'proxys client' de otros servicios para completar el flujo, las transformaciones de los objetos a 'JSON', serán realizadas por medio de la api 'GSON': 



Para los llamados en paralelo de los servicios embebidos y la obtención de sus respuesta para poder enviar los eventos respectivos a la interfaz usuario, por cada servicio que no tenga dependencia, se creará una clase: 'MensajeThread0X' y se procederá a ejecutar de la siguiente manera:



En mi caso lo he desplegado con 'Tomcat7', es importante recordar que el soporte 'SSE' a nivel de SPRING, está disponible con sus librerías 4, en mi caso he usado las 4.2.1:

Para las pruebas del dummy las he reproducido propiamente desde el navegador ingresando a las URLs, amboss servicios tienen el mismo retorno de los eventos, solo que manejan diferente objeto para dicho manejo:

Servicio#1:
http://localhost:8080/DummySpringMvc_SSE/eai/json/sse/getMediador01



Servicio#2:
http://localhost:8080/DummySpringMvc_SSE/eai/json/sse/getMediador02



Para descargar las fuentes del dummy 'SSE' pulsar aquí: http://www.mediafire.com/download/ovqb9q1e60i8lgk/DummySpringMvc_SSE.zip


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.