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/

Windows Firewall e conexões remotas no SQL Server 2008

Salve, salve!! Depois de um intervalo sem postar nada, deixo aqui uma dica rápida para liberar conexões remotas no SQL Server 2008. Crie um arquivo bat com o conteúdo:

@echo =========  SQL Server Ports  ===================
@echo Enabling SQLServer default instance port 1433
netsh firewall set portopening TCP 1433 "SQLServer"
@echo Enabling Dedicated Admin Connection port 1434
netsh firewall set portopening TCP 1434 "SQL Admin Connection"
@echo Enabling conventional SQL Server Service Broker port 4022
netsh firewall set portopening TCP 4022 "SQL Service Broker"
@echo Enabling Transact-SQL Debugger/RPC port 135
netsh firewall set portopening TCP 135 "SQL Debugger/RPC"
@echo =========  Analysis Services Ports  ==============
@echo Enabling SSAS Default Instance port 2383
netsh firewall set portopening TCP 2383 "Analysis Services"
@echo Enabling SQL Server Browser Service port 2382
netsh firewall set portopening TCP 2382 "SQL Browser"
@echo =========  Misc Applications  ==============
@echo Enabling HTTP port 80
netsh firewall set portopening TCP 80 "HTTP"
@echo Enabling SSL port 443
netsh firewall set portopening TCP 443 "SSL"
@echo Enabling port for SQL Server Browser Service's 'Browse' Button
netsh firewall set portopening UDP 1434 "SQL Browser"
@echo Allowing multicast broadcast response on UDP (Browser Service Enumerations OK)
netsh firewall set multicastbroadcastresponse ENABLE

Execute o bat e seja feliz! Abraços

Editado
Tinha esquecido de colocar o link de onde vem o script original: http://support.microsoft.com/kb/968872