Configurar JAAS com banco de dados no JBoss 7 (Parte 1)


Nesse post eu vou mostrar como configurar o JAAS com banco de dados no JBoss 7.

Nessa primeira parte do post nós vamos configurar a base de dados, datasource e security-realm.

Eu estou utilizando o banco MySQL, porém você pode fazer com qualquer base modificando algumas coisas.

Primeiro vamos criar a base:

create database testejaas;

create table user(
	id int primary key not null auto_increment,
	email varchar(30) not null,
	password varchar(32) not null
);

create table role(
	id int primary key not null,
	name varchar(30) not null
);

create table user_role(
	user_id int not null,
	role_id int not null,

	PRIMARY KEY(user_id,role_id),

	FOREIGN KEY (user_id) REFERENCES user(id),
	FOREIGN KEY (role_id) REFERENCES role(id)
);

Com a base criada, vamos criar algumas roles


INSERT INTO role(id,name) VALUES (1,'user');

INSERT INTO role(id,name) VALUES (2, 'admin');

Pronto. Agora vamos configurar um DataSource para a base que nós acabamos de criar. Para isso acrescente o seguinte código no arquivo %JBOSS_HOME%/standalone/configuration/standalone.xml:

.
.
<datasource jta="false" jndi-name="java:/TesteJaas" pool-name="TesteJaas" enabled="true" use-ccm="false">
<connection-url>jdbc:mysql://localhost:3306/testejaas</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver>mysql-connector-java-5.1.24-bin.jar</driver>
<security>
<user-name>root</user-name>
<password>root</password>
</security>
<validation>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
</validation>
<statement>
<share-prepared-statements>false</share-prepared-statements>
</statement>
 </datasource>

Com o DataSource criado, agora nós vamos criar o nosso security-realm, que é onde nós vamos definir os select de busca para o Jaas.

.
.
<security-domain name="jaasTesteJaas" cache-type="default">
<authentication>
<login-module code="Database" flag="required">
<module-option name="dsJndiName" value="java:/TesteJaas"/>
<module-option name="principalsQuery" value="select password from user where email=?"/>
<module-option name="rolesQuery" value="select r.name, 'Roles' from user u, role r, user_role ur where u.id = ur.user_id AND r.id = ur.role_id AND u.email = ?"/>
<module-option name="hashAlgorithm" value="MD5"/>
<module-option name="hashEncoding" value="base64"/>
</login-module>
</authentication>
 </security-domain>

No principalsQuery nós definimos qual é o campo que vai ser levado em consideração como usuário, no caso nós definimos que o campo email da tabela user será usado como o usuário da nossa aplicação.
No rolesQuery nós definimos a select de busca de roles.
No dsJndiName nós colocamos o jndi do datasource.

O hashAlgorithm é o algoritmo de criptografia da senha, existem outros algoritmos, nós vamos usuar o MD5 nesse post.

Pronto a configuração fora da nossa aplicação já está pronta, agora vou criar uma aplicação de exemplo. Defini o nome dela como TesteJaas.

 

Agora vamos criar uma classe pra inserir um usuário com a senha criptografada, no MySQL tem uma função que gera a senha criptografada, mas eu criei uma classe Java para inserir os usuários com senha criptografada.

Segue a classe abaixo para inserir os usuários.

Obs: Eu estou usando Java 7.

Ressalva: Eu chamei a classe de DAO apenas porquê estou inserindo dados na base, não quer dizer que eu implementei o padrão DAO, apenas criei essa classe para inserir os usuários com senhas criptografadas.


package br.com.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;
import org.jboss.crypto.CryptoUtil;

public class UserDAO {

public static void insertUser(String email){

 String sql = "INSERT INTO user(email, password) VALUES(?,?)";

 try(Connection conn = getConnection();
 PreparedStatement pstm = conn.prepareStatement(sql)){

 pstm.setString(1, email);

 pstm.setString(2, CryptoUtil.createPasswordHash("MD5", CryptoUtil.BASE64_ENCODING, null, null, "123456"));

 pstm.execute();

 }catch(Exception e){

 e.printStackTrace();
 }
 }

 public static void insertUserRole(Integer userId, Integer roleId){

 String sql = "INSERT INTO user_role(user_id,role_id) VALUES(?,?)";

 try(Connection conn = getConnection();
 PreparedStatement pstm = conn.prepareStatement(sql)){

 pstm.setInt(1, userId);

 pstm.setInt(2, roleId);

 pstm.execute();

 }catch(Exception e){

 e.printStackTrace();
 }
 }

 public static Connection getConnection() throws SQLException {
 Connection conn = null;

Properties connectionProps = new Properties();
 connectionProps.put("user", "root");
 connectionProps.put("password", "root");
 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testejaas", connectionProps);

 return conn;
 }

 public static void main(String args[]){

 insertUser("brunorota1989@gmail.com");

 insertUser("teste@gmail.com");

 insertUserRole(1,2);

 insertUserRole(2,1);
 }

}

Por enquanto é isso galera, no próximo post vou mostrar como configurar a segurança na aplicação.

Até o próximo post.

7 ideias sobre “Configurar JAAS com banco de dados no JBoss 7 (Parte 1)

    1. brunorota Autor do post

      Opa Anderson.

      Que bom que gostou.

      Vou ver se eu termino esse final de semana, vamos ver se sobra um tempinho hehehe.

      Até +

      Responder
  1. Pingback: Bruno Rota » Configurar JAAS com banco de dados no JBoss 7 (Parte 2)

    1. brunorota Autor do post

      Opa Carlos

      Eu vi no outro comentário que você já achou

      Desculpe não ter respondido antes, é que esta meio corrido aqui pra mim.

      Mas é isso ae

      Obrigado pela visita

      Responder
  2. Carlos

    @Carlos

    Achei! Pra quem tiver dúvida como eu tive é só adicionar o seguinte trecho no pom

    org.jboss.as
    jboss-as-security
    ${version.jboss.as}

    onde, version.jboss.as é a versão do jboss em uso

    Responder

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *