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.
Buen dia prodia indicarme si es tan amable como configurar la persistencia? ,para que me guarde en bd datos ingresados por formularios
ResponderEliminar