JBoss5 security based on MySQL

Create database called jboss_db_security wity the follow structure:

-- Generated by MySQLWorkbench

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL';

CREATE SCHEMA IF NOT EXISTS `jboss_db_security` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `jboss_db_security`;

-- -----------------------------------------------------
-- Table `jboss_db_security`.`usuario`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `jboss_db_security`.`usuario` (
`id` INT NOT NULL AUTO_INCREMENT ,
`user` VARCHAR(45) NOT NULL ,
`pass` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `jboss_db_security`.`role`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `jboss_db_security`.`role` (
`id` INT NOT NULL AUTO_INCREMENT ,
`role` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `jboss_db_security`.`usuario_role`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `jboss_db_security`.`usuario_role` (
`usuario_id` INT NOT NULL ,
`role_id` INT NOT NULL ,
PRIMARY KEY (`usuario_id`, `role_id`) ,
INDEX `fk_usuario_role_usuario` (`usuario_id` ASC) ,
INDEX `fk_usuario_role_role` (`role_id` ASC) ,
CONSTRAINT `fk_usuario_role_usuario`
FOREIGN KEY (`usuario_id` )
REFERENCES `jboss_db_security`.`usuario` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_usuario_role_role`
FOREIGN KEY (`role_id` )
REFERENCES `jboss_db_security`.`role` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION);

USE `jboss_db_security`;

-- -----------------------------------------------------
-- Data for table `jboss_db_security`.`usuario`
-- -----------------------------------------------------
SET AUTOCOMMIT=0;
INSERT INTO `usuario` (`id`, `user`, `pass`) VALUES (1, 'user1', 'pass1');
INSERT INTO `usuario` (`id`, `user`, `pass`) VALUES (2, 'user2', 'pass2');

COMMIT;

-- -----------------------------------------------------
-- Data for table `jboss_db_security`.`role`
-- -----------------------------------------------------
SET AUTOCOMMIT=0;
INSERT INTO `role` (`id`, `role`) VALUES (1, 'administrador');
INSERT INTO `role` (`id`, `role`) VALUES (2, 'superusuario');
INSERT INTO `role` (`id`, `role`) VALUES (3, 'convidado');

COMMIT;

-- -----------------------------------------------------
-- Data for table `jboss_db_security`.`usuario_role`
-- -----------------------------------------------------
SET AUTOCOMMIT=0;
INSERT INTO `usuario_role` (`usuario_id`, `role_id`) VALUES (1, 1);
INSERT INTO `usuario_role` (`usuario_id`, `role_id`) VALUES (1, 2);
INSERT INTO `usuario_role` (`usuario_id`, `role_id`) VALUES (2, 3);

COMMIT;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

 

Drop mysql-connector-java-5.1.6-bin.jar on folder: ${JBOSS_HOME}\server\default\lib\
Where ${JBOSS_HOME} is your JBoss root folder

Create file ${JBOSS_HOME}\server\default\deploy\mysql-ds.xml
With the following contents

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://127.0.0.1:3306/jboss_db_security</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>fiap</password>
    <valid-connection-checker-class-name>
      org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker
    </valid-connection-checker-class-name>
    <metadata>
      <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>

Testing the JDBC connection

Create a new web project Eg: test_jdbc and create the file index.jsp
With the following contents:

<%@page contentType="text/html"
  import="java.util.*,javax.naming.*,javax.sql.DataSource,java.sql.*"%>
<%
  DataSource ds = null;
  Connection con = null;
  PreparedStatement pr = null;
  InitialContext ic;
  try {
    ic = new InitialContext();
    ds = (DataSource) ic.lookup("java:/MySqlDS");
    con = ds.getConnection();
    pr = con.prepareStatement("SELECT USER, PASS FROM USUARIO");
    ResultSet rs = pr.executeQuery();
    while (rs.next()) {
      out.println("<br> " + rs.getString("USER") + " | " + rs.getString("PASS"));
    }
    rs.close();
    pr.close();
  } catch (Exception e) {
    out.println("Exception thrown " + e);
  } finally {
    if (con != null) {
      con.close();
    }
  }
%>

Deploy it on JBoss and open on your browser: http://localhost:8080/test_jdbc

You should get:
user1 | user1
user2 | pass2

Edit the file: ${JBOSS_HOME}\server\default\conf\login-config.xml and add the following node:

<application-policy name="test-policy">
  <authentication>
    <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
      <module-option name="dsJndiName">java:/MySqlDS</module-option>
      <module-option name="principalsQuery">
          SELECT pass FROM usuario WHERE user = ?
      </module-option>
      <module-option name="rolesQuery">
          SELECT
            r.role, 'Roles'
          FROM
            usuario_role ur
            INNER JOIN role r ON ur.role_id = r.id
            INNER JOIN usuario u ON ur.usuario_id = u.id
          WHERE
            u.user = ?
      </module-option>
    </login-module>
  </authentication>
</application-policy>

References:

http://www.jboss.org/community/wiki/DatabaseServerLoginModule
JBoss5_Installation_And_Getting_Started_Guide.pdf

Fale conosco

Utilize o formulário ao lado

Gren 2024