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/