jueves, 20 de octubre de 2016

Configurar jBPM para obtener Grupos y Usuarios desde nuestra Base de Datos

jBPM en su serie 6.x viene configurado para usar su propio esquema de Roles (Grupos) y Usuarios, pero un requerimiento muy frecuente es permitir que el jBPM busque u obtenga los Grupos y Usuarios desde nuestros medios personalizados, usualmente una Base de Datos.

Escribo este artículo debido a que recientemente me encontraba trabajando en un par de proyectos de BPM con jBPM 6.3, y era requisito obtener los Usuarios y Grupos desde una fuente relacional, razón por la cual me toco apoyar al arquitecto de turno en cómo realizar esa tarea.

Ya en un artículo anterior aprendimos a configurar el jBPM para que haga uso de nuestra propia Base de Datos favorita, Postgresql, para la persistencia de sus datos. Hoy vamos a seguir con ese ejemplo como base para aprovechar el ambiente que se definió en esa oportunidad.

Así que sin mas preámbulos manos a las sobras…






1.- Crear nuestra estructura de tablas.

O usar la que ya tenemos. En todo caso en este ejemplo usaremos la base de datos denominada usersrolesbd con la siguiente definición de tablas:


Tabla
users
Columna
Tipo
Valor por omisión
login_name * PK
Character(20)


user_fullname *
Character(80)


user_lang
Character(5)
en-UK
user_email
Character(120)


user_isgroup
boolean
false

Tabla de Usuarios (y Grupo o Rol)


Tabla
usersbyrol
Columna
Tipo
Valor por omisión
Id * PK
Autogenerada


rol_name * FK (users)
Character(20)


user_name * FK (users)
Character(20)



Tabla de Usuarios por Rol


2.- Generar scripts de Consultas y cargar datos base de Administrador.

2.1.- Haremos uso de las siguientes consultas de SQL :

Propiedad
SQL
Descripción
db.user.query
SELECT login_name FROM users WHERE login_name = ?
Consulta sí existe un usuario dado su nombre de usuario o login
db.roles.query
SELECT login_name FROM users WHERE login_name = ? AND user_isgroup = ‘true’
Consulta sí existe el Grupo o Rol dado su nombre de grupo
db.user.roles.query
SELECT rol_name FROM usersbyrol WHERE user_name = ?
Consulta los Roles para un nombre de usuario dado
db.name.query
SELECT user_fullname FROM users WHERE login_name = ?
Consulta el nombre de un usuario dado su login
db.email.query
SELECT user_email FROM users WHERE login_name = ?
Consulta el email de un usuario o grupo dado su login o nombre de usuario
db.lang.query
SELECT user_lang FROM users WHERE login_name = ?
Consulta el Lenguaje para un usuario dado su login
db.has.email.query
SELECT user_email FROM users WHERE login_name = ?
Consulta sí el Grupo tiene email
db.group.mem.query
SELECT user_name FROM usersbyrol WHERE rol_name = ?
Consulta los usuarios para un Grupo o Rol dado


2.2.- Crear datos bases.

En la tabla users agregar los siguientes registros:

Columna
Valor
login_name * PK
admin
user_fullname *
Administrador Admin
user_lang
en-UK
user_email
maildeladmin@correo.com
user_isgroup
false

Columna
Valor
login_name * PK
Administrator
user_fullname *
Administrador Administrator
user_lang
en-UK
user_email
maildeladministrator@correo.com
user_isgroup
false

Columna
Valor
login_name * PK
Administrators
user_fullname *
Grupo Administrador
user_lang
en-UK
user_email


user_isgroup
true


Puede crear otros usuarios y grupos de su elección. Pero no debe olvidar los antes indicados.


En la tabla usersbyrol agregar los siguientes registros:

Columna
Valor
rol_name * FK (users)
Administrators
user_name * FK (users)
admin

Columna
Valor
rol_name * FK (users)
Administrators
user_name * FK (users)
Administrator

Puede relacionar otros usuarios y grupos. Pero no debe olvidar loa antes indicados.


3.- Crear DataSource de acceso en servidor Wildfly.

Una vez que tenemos definida nuestra base de datos, su estructura y los scripts de sql respectivos, procedemos a crear el DataSource correspondiente para poder acceder a nuestra base de datos mediante su JNDI pertinente.

Para ello haremos lo siguiente:


3.1.- Abrir la consola de administración del servidor.
Accedemos a la ruta en la que se encuentre nuestro servidor de jBPM, por ejemplo



3.2.- Ingresar las credenciales del usuario administrador en caso de que sean solicitadas.
Si aun no tiene un usuario administrador creado, al abrir la url antes mencionada, será redireccionado a una página donde se le señala esta circunstancia, y se le invita a ejecutar un comando adecuado “add-user.bat / add-user.sh” para incorporar el usuario de management adecuado.




3.3.- Ir a la sección Create datasource.

Hacemos click o pinchamos en el enlace para crear datasources.



3.4.- Hacer click o pinchar en el botón “add”.

Esto nos lleva a la ventana donde debemos ingresar los datos para nuestro datasource.


3.5.- Ingresar datos de identificación del datasource.

Hay que poner especial atención a ingresar la JNDI en el formato adecuado.
Se acostumbra que sea java:jboss/datasources/DATASOURCE_NAME.



Datos:


Name = users_rolesDS
JNDI = java:jboss/datasources/users_rolesDS

Ingresar datos y pulsar “next” o siguiente.


3.6.- Seleccionamos el Driver adecuado.

Se nos presenta la lista de drivers declarados, de no existir aún el nuestro lo definimos o bien detectándolo o especificando el driver.



En nuestro ejemplo usamos el driver existente para nuestra conexión a Postgresql del ejemplo anterior.
Seleccionar el driver adecuado y pulsar “next” o siguiente.


3.7.- Ingresar datos para la conexión jdbc.

En esta sección se solicitan los datos adecuados para realizar el acceso a la base de datos y probar la conexión respectiva.



Datos:


Connection URL = jdbc:postgresql://localhost:5432/usersrolesdb
Username = jbpmuser
Password = ******** (el que corresponda)

Hacer click o pinchar en “Test connection”. En caso de error revisar nuestros datos de acceso y url de conexión.

Cuando todo este correcto pulsar “Done”.


3.8.- Activar nuestro datasource.

Pare ellos sólo debemos seleccionar nuestro datasource recien creado en la lista de datasources disponibles, y hacer click o pinchar en el botón “enable”.


4.- Preparar archivos de configuración.

En un editor de texto de su preferencia cree y edite los siguientes archivos con el contenido indicado.


4.1.- Archivo jbpm.usergroup.callback.properties:


db.ds.jndi.name=java:jboss/datasources/users_rolesDS
db.user.query=SELECT login_name FROM users WHERE login_name = ?
db.roles.query=SELECT login_name FROM users WHERE login_name = ? AND user_isgroup = ‘true’
db.user.roles.query=SELECT rol_name FROM usersbyrol WHERE user_name = ?

# Note que las propiedades y los valores de las Query son las que ya habíamos definido con anterioridad.

# Este archivo se usa para definir como obtener los roles para un usuario dado


4.2.- Archivo jbpm.user.info.properties:


db.ds.jndi.name=ava:jboss/datasources/users_rolesDS
db.name.query=SELECT user_fullname FROM users WHERE login_name = ?
db.email.query=SELECT user_email FROM users WHERE login_name = ?
db.lang.query=SELECT user_lang FROM users WHERE login_name = ?
db.has.email.query=SELECT user_email FROM users WHERE login_name = ?
db.group.mem.query=SELECT user_name FROM usersbyrol WHERE rol_name = ?

# Note que las propiedades y los valores de las Query son las que ya habíamos definido con anterioridad.

# Este archivo se usa para definir como obtener la información extra para un usuario dado.


5.- Configurar archivo .war.

El siguiente paso consiste en modificar nuestro archivo .war correspondiente al jbpm_console para que admita la configuración de usuarios y roles desde nuestra base de datos.

Para ello tenemos que ir al directorio de instalación del jBPM instaler, JBPM_INSTALLER_HOME, e ir al direcorio /lib. Allí encontraremos el archivo el archivo .war correspondiente al jbpm-console adecuado a nuestra versión. En este ejemplo usamos la versión 6.3, por lo que el .war que debemos usar es el jbpm-console-6.3.0.Final-wildfly-8.1.0.Final.war.

Una vez ubicado ese .war, lo abrimos con alguna herramienta adecuada para manipular archivos .zip (winzip. 7Zip, winrar, gestor de archivadores, etc).


5.1.- Configurar el archivo beans.xml.

Dentro del .war ir al directorio /WEB-INF/ y abrir el archivo beans.xml.

Ubicar la linea que dice:


<class>
    org.jbpm.services.cdi.producer.JAASUserGroupInfoProducer
</class>

Nota: Esto indica que se usa la implementación de JAAS por omisión.

Y reemplazarla por:


<class>
    org.jbpm.services.cdi.producer.DBUserGroupInfoProducer
</class>

Lo que indica al jBPM que queremos usar la implementación para Grupos y Usuarios por Base de Datos que viene con la herramienta.

Recuerde guardar los cambios realizados al archivo.


5.2.- Configurar archivos .properties.

Dentro del .war ir al directorio /WEB-INF/classes/. Seguidamente ubicamos nuestros archivos:


jbpm.user.info.properties
jbpm.usergroup.callback.properties
userinfo.properties

Los cuales ya teníamos listos desde los pasos anteriores. Seleccionamos esos archivos y los arrastramos y soltamos en el directorio /WEB-INF/classes/ del .war del jbpm-console. Sí nos pregunta sí deseamos reemplazar algún archivo existente respondemos que si a todo.


5.3.- Actualizar el .war de jbpm-console.

Cerramos el editor del .war. Si nos pregunta sí deseamos guardar los cambios y actualizar el archivo respondemos que SI, obviamente.

Paso seguido, nos dirigimos al directorio del instaler de jBPM, JBPM_INSTALLER_HOME, y por la consola ejecutamos el comando:

ant install.demo.noeclipse

Mediante el cual se generara la nueva instalación con las configuraciones realizadas.


LISTO!!! Ya debe tener jBPM configurado para usar su Base de Datos personalizada para Grupos y Usuarios.



Éxito y hasta una próxima entrega.

1 comentario:

  1. Buen dia prodia indicarme si es tan amable como configurar la persistencia? ,para que me guarde en bd datos ingresados por formularios

    ResponderEliminar