jBPM Console 6.2.0.Final / JBoss: Autenticação utilizando seu banco de dados

Neste post, vamos aprender como realizar a autenticação do jBPM Console a partir de um banco de dados.

Conforme consta na documentação, o jbpm console utiliza a autenticação padrão do JBoss, que se baseia em dois arquivos: users.properties e roles.properties.

O primeiro contém a lista de usuários válidos e suas respectivas senhas. O segundo contém os usuários e a lista de grupos ao qual ele pertence. Esse método de autenticação está definido dentro do WAR, no arquivo WEB-INF/jboss-web.xml:

<security-domain>other</security-domain>

Essa configuração indica que o workbench irá utilizar o modelo de autenticação que estiver especificado no security domain chamado “other” dentro do standalone-*.xml.

Por padrão, esse security domain estará configurado conforme abaixo:

<security-domain name="other" cache-type="default">
    <authentication>
        <login-module code="UsersRoles" flag="required">
            <module-option name="usersProperties" value="${jboss.server.config.dir}/users.properties"/>
            <module-option name="rolesProperties" value="${jboss.server.config.dir}/roles.properties"/>
        </login-module>
    </authentication>
</security-domain>

Ok, agora sabemos como funciona por padrão. Agora vamos fazer os ajustes necessários para que possamos validar os usuários em nossa base de dados:

<security-domain name="other" cache-type="default">
    <authentication>
        <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
            <module-option name="dsJndiName" value="java:jboss/datasources/ExemploDS"/>
            <module-option name="principalsQuery" value="select senha as password from usuario where login = ?"/>
            <module-option name="rolesQuery" value="select g.nome as role, 'Roles' from usuario u inner join grupo g on (g.id = u.id_grupo) where u.login = ? union all select 'admin' as role, 'Roles'"/>
            <module-option name="hashAlgorithm" value="SHA-256"/>
            <module-option name="hashEncoding" value="hex"/>
        </login-module>
    </authentication>
</security-domain>

Temos dois “tricks” nesta configuração:

<module-option name="rolesQuery" value="select g.nome as role, 'Roles' from usuario u inner join grupo g on (g.id = u.id_grupo) where u.login = ? union all select 'admin' as role, 'Roles'"/>

Apenas usuários que pertencem as roles: admin, user e manager podem fazer logon. É provável que você não tenha essas roles cadastradas em sua tabela de grupos e provavelmente você não vai querer ficar limitado à essas 3 roles … o jeito então é retornar ambas de alguma forma. No exemplo eu utilizei uma union mas nada impede que você tenha uma função/procedure, uma tabela apenas para as roles, valores fixos, etc. O importante aqui é você saber que irá precisar de uma role que te autorize logar no console e você vai precisar de “roles” ou grupos para você criar seus processos ok?

    <module-option name="hashAlgorithm" value="SHA-256"/>
    <module-option name="hashEncoding" value="hex"/>

Essas duas linhas são opcionais e os valores vão depender da forma que suas senhas estão armazenadas em seu banco de dados. Se elas estiverem em plaintext, não será necessário nenhuma das duas linhas. Em meu caso, estou usando SHA-256 como criptografia e gravando os dados em hexadecimal.

A última configuração (confesso que não tenho 100% de certeza de que é necessária, se alguém souber, comente), é fazer com que a API (KIE Remote Services :: Cliente)  também utilize o mesmo método de autenticação:

<security-realm name="ApplicationRealm">
    <authentication>
        <jaas name="other"/>
    </authentication>
</security-realm>

Segue um bom material sobre security realms do JBoss: http://docs.jboss.org/jbossweb/3.0.x/realm-howto.html#DataSourceRealm

Até o próximo post o/

Tutorial de Instalação do jBPM 6.2 + PostgreSQL + JBoss 7.1 Final + Eclipse

Fala galera! O objetivo deste tutorial é guiá-los na instalação do jBPM 6.2.0.Final utilizando como base de dados o PostgreSQL. Não abordarei a instalação do PostgreSQL e do Ant pois não é o foco do tutorial.

AMBIENTE

Para este tutorial, estou utilizando o sistema operacional Ubuntu 14.04 mas nada impede que você utilize Windows ou qualquer outra distro Linux ok?

INGREDIENTES

  • Instalador do jBPM-6.2.0.Final
  • PostgreSQL
  • Ant
  • Uma boa conexão
  • Paciência

INSTALAÇÃO

Baixe o instalador: http://sourceforge.net/projects/jbpm/files/jBPM%206/jbpm-6.2.0.Final/jbpm-6.2.0.Final-installer-full.zip/download

Descompacte o arquivo no diretório “/opt” (ou em outro diretório de sua preferência)

Abra o arquivo build.properties que está na raiz do diretório “/opt/jbpm-installer”. O trabalho aqui é comentar/descomentar linhas, exceto a configuração do PostgreSQL que vamos adicionar.

As 3 primeiras linhas do arquivo indicam o diretório home da instalação, a snapshot e a release. Não é necessário fazer nenhuma alteração aqui.

install.home=./
snapshot.version=6.2.0-SNAPSHOT
release.version=6.2.0.Final

O próximo bloco diz respeito a versão do jBPM que iremos utilizar, como vamos trabalhar com a release, descomente as linhas abaixo e comente as demais:

jBPM.version=${release.version}
jBPM.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/droolsjbpm-bpms-distribution/${jBPM.version}/droolsjbpm-bpms-distribution-${jBPM.version}-bin.zip

A próxima configuração é a respeito do WAR do jBPM Console que iremos instalar, em nosso caso, para JBoss AS 7:

jBPM.console.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-jboss-as7.war

Eclipse + plugin jBPM e Drools:

droolsjbpm.eclipse.version=${release.version}
droolsjbpm.eclipse.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/org.drools.updatesite/${droolsjbpm.eclipse.version}/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip

e

eclipse.home=./eclipse
eclipse.clean.workspace=true

JBoss AS 7.1.1.Final:

jboss.server.version=as-7.1.1.Final
jboss.home=./jboss-${jboss.server.version}
jboss.download.url=http://download.jboss.org/jbossas/7.1/jboss-${jboss.server.version}/jboss-${jboss.server.version}.zip
jboss.server.conf.dir=${jboss.home}/standalone/configuration
jboss.server.deploy.dir=${jboss.home}/standalone/deployments
jboss.server.data.dir=${jboss.home}/standalone/data
jboss.clean.repository=true
jboss.war.type=${jboss.server.version}

O próximo é Dashboard. Dashboard é uma ferramenta utilizada para medir indicadores dos processos.

dashboard.version=${release.version}
dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-jboss-as7.war

E finalmente, o banco de dados. Por padrão, o jBPM usa o H2 como backend. Nós iremos utilizar o PostgreSQL 9.3 e a partir dessa configuração, fica fácil utilizar qualquer outro banco de dados.

Quem já tiver alguma experiência com módulos do JBoss, não terá nenhuma dificuldade aqui.
As duas linhas abaixo são respectivamente: O caminho de origem para o driver (jar) e a pasta do módulo no JBoss.

db.driver.jar=${install.home}/db/driver/${db.driver.jar.name}
db.driver.module.dir=${jboss.home}/modules/${db.driver.module.prefix}/main/

Faça o download do driver postgresql-9.3-1103.jdbc4.jar e salve-o na pasta “/opt/jbpm-installer/db/driver”.
No build.properties, comente as linhas referente ao H2 e acrescente as linhas abaixo:

#postgresql
db.name=postgresql
db.driver.module.prefix=org/postgresql
db.driver.jar.name=postgresql-9.3-1103.jdbc4.jar
db.driver.download.url=https://repository.jboss.org/nexus/content/repositories/thirdparty-uploads/postgresql/postgresql/9.1-902.jdbc4/postgresql-9.1-902.jdbc4.jar

Pronto. Depois de realizar essas alterações, seu arquivo build.properties deve se parecer com esse:

# NOTES for doing a release
# - replace all *.url variables with the variables marked as <RELEASE>
# - make sure all *.version variables = ${release.version}
# - set ${release.version} to the current release version.

install.home=./
snapshot.version=6.2.0-SNAPSHOT
release.version=6.2.0.Final

# the version of jBPM you want to use
# and the associated URL you want to get the dependencies from
# for example:
#<RELEASE>
#   jBPM.version=${release.version}
#   jBPM.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/jbpm-distribution/${jBPM.version}/jbpm-distribution-${jBPM.version}-bin.zip
# or:
#<SNAPSHOT>
#   jBPM.version=${snapshot.version}
#   jBPM.url=https://hudson.jboss.org/hudson/job/jBPM/lastSuccessfulBuild/artifact/jbpm-distribution/target/jbpm-${jBPM.version}-bin.zip
jBPM.version=${release.version}
jBPM.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/droolsjbpm-bpms-distribution/${jBPM.version}/droolsjbpm-bpms-distribution-${jBPM.version}-bin.zip

# the version of jBPM Console you want to use
# and the associated URL you want to get it from
# for example:
#<RELEASE>
# for AS7:
jBPM.console.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-jboss-as7.war
# for EAP 6.4:
#   jBPM.console.url=http://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-eap6_4.war
# for WildFly8:
#   jBPM.console.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/kie/kie-wb-distribution-wars/${jBPM.version}/kie-wb-distribution-wars-${jBPM.version}-wildfly8.war
# or:
#<SNAPSHOT>
#   jBPM.console.url=https://hudson.jboss.org/hudson/job/kie-wb-distributions/lastSuccessfulBuild/artifact/kie-wb/kie-wb-distribution-wars/target/kie-wb-${jBPM.version}-wildfly8.war

# the version of jBPM and Drools Eclipse plugin you want to use
# and the associated URL you want to get the dependencies from
# for example:
#<RELEASE>
#   droolsjbpm.eclipse.version=${release.version}
#   droolsjbpm.eclipse.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/org.drools.updatesite/${droolsjbpm.eclipse.version}/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip
# or:
#<SNAPSHOT>
#   droolsjbpm.eclipse.version=${snapshot.version}
#   droolsjbpm.eclipse.url=https://hudson.jboss.org/hudson/job/droolsjbpm-tools/lastSuccessfulBuild/artifact/drools-eclipse/org.drools.updatesite/target/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip
droolsjbpm.eclipse.version=${release.version}
droolsjbpm.eclipse.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/drools/org.drools.updatesite/${droolsjbpm.eclipse.version}/org.drools.updatesite-${droolsjbpm.eclipse.version}.zip

# the home of your eclipse installation
# will be used to deploy the Eclipse plugin to
eclipse.home=./eclipse
eclipse.clean.workspace=true

# the home of your JBoss AS installation
# for example, for AS7:
jboss.server.version=as-7.1.1.Final
jboss.home=./jboss-${jboss.server.version}
jboss.download.url=http://download.jboss.org/jbossas/7.1/jboss-${jboss.server.version}/jboss-${jboss.server.version}.zip
jboss.server.conf.dir=${jboss.home}/standalone/configuration
jboss.server.deploy.dir=${jboss.home}/standalone/deployments
jboss.server.data.dir=${jboss.home}/standalone/data
jboss.clean.repository=true
#   IMPORTANT: make sure to also set the H2.version property (below) to 1.3.161
# or for EAP 6.4
#   jboss.server.version=eap-6.4.0
#   jboss.home=./jboss-eap-6.4
#   jboss.download.url=### you need to manually download the eap 6.4.0 zip and put it in the lib folder ###
#   jboss.server.conf.dir=${jboss.home}/standalone/configuration
#   jboss.server.deploy.dir=${jboss.home}/standalone/deployments
#   jboss.server.data.dir=${jboss.home}/standalone/data
#   jboss.clean.repository=true
# or for Wildfly8
#   jboss.server.wildfly.version=8.1.0.Final
#   jboss.server.version=wildfly-${jboss.server.wildfly.version}
#   jboss.home=./${jboss.server.version}
#   jboss.download.url=http://download.jboss.org/wildfly/${jboss.server.wildfly.version}/${jboss.server.version}.zip
#   jboss.server.conf.dir=${jboss.home}/standalone/configuration
#   jboss.server.deploy.dir=${jboss.home}/standalone/deployments
#   jboss.server.data.dir=${jboss.home}/standalone/data
#   jboss.clean.repository=true
jboss.war.type=${jboss.server.version}

# jboss.port.offset=0
# org.uberfire.nio.git.daemon.port=9418
# org.uberfire.nio.git.ssh.port=8001

# the version of Dashboard Builder you want to use
# and the associated URL you want to get it from
# for example:
#<RELEASE>
# for AS7:
dashboard.version=${release.version}
dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-jboss-as7.war
# for EAP 6.4:
#   dashboard.version=${release.version}
#   dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-eap6_4.war
# for Wildfly8:
#   dashboard.version=${release.version}
#   dashboard.url=https://repository.jboss.org/nexus/content/groups/public-jboss/org/jbpm/dashboard/jbpm-dashboard-distributions/${dashboard.version}/jbpm-dashboard-distributions-${dashboard.version}-wildfly8.war
# or:
#<SNAPSHOT>
#   dashboard.version=${snapshot.version}
#   dashboard.url=https://hudson.jboss.org/hudson/job/jbpm-dashboard/lastSuccessfulBuild/artifact/jbpm-dashboard-distributions/target/jbpm-dashbuilder-${dashboard.version}-wildfly8.war

# data base related properties
db.driver.jar=${install.home}/db/driver/${db.driver.jar.name}
db.driver.module.dir=${jboss.home}/modules/${db.driver.module.prefix}/main/
# default is H2
# H2.version=1.3.168
# db.name=h2
# db.driver.jar.name=h2-${H2.version}.jar
# db.driver.download.url=http://repo1.maven.org/maven2/com/h2database/h2/${H2.version}/h2-${H2.version}.jar
#other options are:
#mysql
#  db.name=mysql
#  db.driver.module.prefix=com/mysql
#  db.driver.jar.name=mysql-connector-java-5.1.18.jar
#  db.driver.download.url=https://repository.jboss.org/nexus/service/local/repositories/central/content/mysql/mysql-connector-java/5.1.18/mysql-connector-java-5.1.18.jar
#postgresql
db.name=postgresql
db.driver.module.prefix=org/postgresql
db.driver.jar.name=postgresql-9.3-1103.jdbc4.jar

Agora, vamos executar o instalador e esperar (bastante):

ant install.demo

Enquanto você espera a instalação finalizar, vamos configurar o BD:

  • Crie um novo banco de dados chamado jbpm
  • Vá até a pasta “/opt/jbpm-installer/db/ddl-scripts/postgres/”
  • Execute o script postgresql-jbpm-schema.sql e na sequência quartz_tables_postgres.sql

Quando a instalação finalizar, abra o arquivo “/opt/jbpm-installer/jboss-as-7.1.1.Final/bin/standalone.conf”, na linha 50, e altere as configurações como na linha abaixo:

-Xmx1024m -XX:MaxPermSize=512m

e na linha 52:

JAVA_OPTS="$JAVA_OPTS -Djboss.server.default.config=standalone-full.xml"

Abra o arquivo “/opt/jbpm-installer/jboss-as-7.1.1.Final/standalone/configuration/standalone-full.xml”, localize a seção datasource e adicione:

<datasource jta="true" jndi-name="java:jboss/datasources/jbpmDS" pool-name="jbpmDS" enabled="true" use-java-context="true" use-ccm="true">
    <connection-url>jdbc:postgresql://localhost:5432/jbpm</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <driver>postgresql</driver>
    <pool>
        <min-pool-size>2</min-pool-size>
        <max-pool-size>100</max-pool-size>
    </pool>
    <security>
        <user-name>postgres</user-name>
        <password>postgres</password>
    </security>
    <validation>
        <validate-on-match>false</validate-on-match>
        <background-validation>false</background-validation>
        <background-validation-millis>1</background-validation-millis>
    </validation>
    <statement>
        <prepared-statement-cache-size>64</prepared-statement-cache-size>
        <share-prepared-statements>true</share-prepared-statements>
    </statement>
</datasource>

E na seção drivers, acrescente:

<driver name="postgresql" module="org.postgresql">
    <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
</driver>

Se tudo estiver correto, você já pode iniciar o JBoss:

$ cd /opt/jbpm-installer/jboss-as-7.1.1.Final/bin/
$ ./standalone.sh -b 0.0.0.0

Se apareceu “Deployed” no terminal, você já pode acessar o jbpm-console: http://localhost:8080/jbpm-console

Espero que tudo tenha dado certo!

Um abraço e até o próximo post!