Continuando o post anterior http://jbossdivers.wordpress.com/2012/01/20/introducao-ao-jboss-as-7-parte-1/, hoje o objetivo será criar um novo data source e um domínio de segurança baseado em banco de dados com a senha escriptada.
Como o nosso foco aqui é o JBoss AS 7, utilize o post http://jbossdivers.wordpress.com/2011/08/29/instalando-mysql-5-5-on-centos-5-6/, para se ambientar com o MySQL. Crie um banco de dados chamado db_security. Vamos utiliza-lo para armazenar os nossos roles e passwords.
1 – Instalando um Driver JDBC / MySQL como Módulo
Devemos realizar o download do driver JDBC para o nosso banco de dados, que no caso é o MySQL 5.
O driver pode se baixado no seguinte endereço: http://dev.mysql.com/downloads/connector/j/
A estrutura de diretórios do nosso módulo deve ser criada conforme exemplificada abaixo:
mkdir -p jboss-as-7.1.0.CR1/modules/com/mysql/main
O diretório “main”, conterá os arquivos mysql-connector-java-5.1.18-bin.jar e o module.xml.
Para copiar o driver execute:
cp mysql-connector-java-5.1.18-bin.jar /jboss-as-7.1.0.CR1/modules/com/mysql/main/
O Próximo passo, é criar o arquivo module.xm
vim jboss-as-7.1.0.CR1/modules/com/mysql/main/module.xml
Inserindo o conteúdo abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql">
<resources>
<resource-root path="mysql-connector-java-5.1.18-bin.jar"/>
</resources>
<dependencies>
<module name="javax.api"/>
</dependencies>
</module>
Agora vamos fazer com o que o JBoss AS 7, reconheça o novo módulo de Data Source. Para isso devemos editar o arquivo standalone.xml, para isso execute:
vim jboss-as-7.1.0.CR1/standalone/configuration/standalone.xml
O “subsystem” <subsystem xmlns=”urn:jboss:domain:datasources:1.0″>, deve ser editado, e o conteúdo abaixo deve ser inserido:
<!--<datasources> -->
<datasource jndi-name="java:/MySQLDS" pool-name="MyPool" enabled="true" jta="true" use-java-context="true" use-ccm="true">
<connection-url>jdbc:mysql://localhost:3306/db_security</connection-url>
<driver>mysql</driver>
<security>
<user-name>usuario_database</user-name>
<password>senha_database</password>
</security>
<statement>
<prepared-statement-cache-size>100</prepared-statement-cache-size>
<share-prepared-statements/>
</statement>
</datasource>
<!--<drivers>-->
<driver name="mysql" module="com.mysql"/>
<!--</drivers>-->
<!--</datasources>-->
Reinicie o JBoss e o datasource para o MySQL estará disponível.
Você deverá ver algo pareçido com a mensagem abaixo:
15:33:51,221 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-3) JBAS010400: Bound data source [java:/MySQLDS]</em>
2 – Criando Domínio de Segurança Baseado em Banco de Dados com a Senha do Data Source Encriptada
A primeira coisa a ser feita é gerar a senha do banco de dados utilizando um algoritmo do Picketbox. Para isso execute os comandos abaixo:
cd $JBOSS_HOME$ java -cp modules/org/jboss/logging/main/jboss-logging-3.1.0.CR2.jar:modules/org/picketbox/main/picketbox-4.0.6.Beta2.jar org.picketbox.datasource.security.SecureIdentityLoginModule senha Encoded password: -21fe4fcab9086fdc
Agora edite o arquivo:
vim jboss-as-7.1.0.CR1/standalone/configuration/standalone.xml
Encontre o Subsystem “<subsystem xmlns=”urn:jboss:domain:security:1.0″>” e entre as tags <security-domains>
Insira o conteúdo abaixo.
<security-domain name="security-encrypted-ds" cache-type="default">
<authentication>
<login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
<module-option name="username" value="usuario_database"/>
<module-option name="password" value="-21fe4fcab9086fdc"/>
<module-option name="managedConnectionFactoryName" value="jboss.jca:service=LocalTxCM,name=MyPool"/>
</login-module>
</authentication>
</security-domain>
Edite novamente o “Subsystem” <subsystem xmlns=”urn:jboss:domain:datasources:1.0″>, dentro da tag <security> :
Remova:
<user-name>usuario_database</user-name> <password>senha_database</password>
E adicione o dominio de segurança que acabamos de configurar:
<security-domain>security-encrypted-ds</security-domain>
Pronto
, o nosso data source está funcionando com a senha encriptada, agora vamos criar um domínio de segurança, que utiliza o data source encriptado e armazena os roles e users em tabelas.
Vamos gerar a senha encriptada do usuário que irá acessar o nosso domínio de segurança, para isso crie uma classe Java, utilizando a estrutura abaixo:
As libs utilizadas são: modules/org/jboss/logging/main/jboss-logging-3.1.0.CR2.jar
modules/org/picketbox/main/picketbox-4.0.6.Beta2.jar
import org.jboss.security.auth.spi.Util;
public class Main {
public static Util util;
public static void main(String[] args) {
System.out.println(util.createPasswordHash("SHA-256", "BASE64", null, null, "senha"));
}
}
Retorno: t+lL5RPpboxFzSPRYideWhLr3pEApCXE683X+k3NiXw=
Crie as tabelas abaixo no db_security:
create table users (username varchar(32) not null primary key,password varchar(100) not null);
create table roles (username varchar(32) not null,rolename varchar(32) not null,primary key (username, rolename));
insert into users (username, password) values ("usuario", "t+lL5RPpboxFzSPRYideWhLr3pEApCXE683X+k3NiXw=");
insert into roles values ("usuario", "Admin");
Novamente no Subsystem “<subsystem xmlns=”urn:jboss:domain:security:1.0″>” e entre as tags <security-domains>
Insira o conteúdo abaixo:
<security-domain name="security-database" cache-type="default">
<authentication>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:/MySQLDS"/>
<module-option name="principalsQuery" value="select password from users where username=?"/>
<module-option name="rolesQuery" value="select rolename, 'Roles' from roles where username=?"/>
<module-option name="hashAlgorithm" value="SHA-256"/>
<module-option name="hashEncoding" value="base64"/>
</login-module>
</authentication>
</security-domain>
Agora na aplicação Web, adicione o conteúdo abaixo no web.xml
<security-constraint> <web-resource-collection> <web-resource-name>HtmlAuth</web-resource-name> <description>Test Security Domains</description> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>Admin</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>My Test JBoss AS 7</realm-name> </login-config> <security-role> <role-name>Admin</role-name> </security-role>
Crie o arquivo jboss-web.xml, e adicione o conteúdo abaixo:
<jboss-web> <security-domain>java:/jaas/security-database</security-domain> </jboss-web>
Realize o deploy e acesse pelo browser de sua preferência, a aplicação deverá pedir o usuário e senha que estão armazenados no banco de dados.
Vou deixar os principais arquivos utilizado nesse post aqui para download.
Link: Arquivos
Abraços a todos

#1 by Jorge Guedes on 23 de janeiro de 2012 - 15:34
Mocokinha…. isso ai.. mais um post… parabens
#2 by Mauricio Magnani on 23 de janeiro de 2012 - 17:56
Vlw Jorgete
Sdd de Vcs ai..
abraços!
#3 by celmo on 24 de janeiro de 2012 - 15:52
Estou tentando executar o comando: java -cp modules/org/jboss/logging/main/jboss-logging-3.1.0.CR2.jar:modules/org/picketbox/main/picketbox-4.0.6.Beta2.jar org.picketbox.datasource.security.SecureIdentityLoginModule minhasenha, e estou recebendo a seguinte mendagem de erro “Erro: Nao foi possivel localizar nem carregar a classe principal org.picketbox.datasource.security.SecureIdentityLoginModule”
#4 by Mauricio Magnani on 24 de janeiro de 2012 - 21:25
Olá Celmo, isso é bem simples, verifique se os JARs desse comando estão realmente no JBoss AS e os caminhos estão corretos,vai na linha de comando no linux e faz o comando passo a passo e vai dando tab que ele vai completando. Nesse post estou utilizando a versão jboss-as-7.1.0.CR1.
Qualquer coisa posta ai novamente
abraços!