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.
Parabéns pelo post. Estou ansioso pela segunda parte. Alguma previsão?
Opa Anderson.
Que bom que gostou.
Vou ver se eu termino esse final de semana, vamos ver se sobra um tempinho hehehe.
Até +
Pingback: Bruno Rota » Configurar JAAS com banco de dados no JBoss 7 (Parte 2)
Bruno, estou usando JBOSS 7.1.1 e Maven 3. Como faço pra adicionar essa dependência do CryptoUtil?
Obrigado!
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
@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
Opa Carlos
Obrigado pela dica
Com certeza vai ajudar muita gente =)
Abraços