Introdução ao JBoss AS 7.1 – Parte 2

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. #1 by Jorge Guedes on 23 de janeiro de 2012 - 15:34

    Mocokinha…. isso ai.. mais um post… parabens

  2. #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!

  1. Salvando o Log no Banco de Dados no JBoss AS 7 « Learning JBoss

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.