Glassfish v3 et authentification via une table Oracle

La plupart des applications nécessite de mettre en place de la sécurité. Glassfish v3 (comme Weblogic) peut faire ça pour nous ! Si vous ne voulez pas commencer votre développement par la mise en place d’un LDAP ou d’un fichier qu’il ne faudra pas oublier quand vous créerez de nouvelles configurations, je vous suggère d’utiliser, pour commencer, le JDBCRealm. Celui-ci permet, en effet, de définir un ensemble de tables et gérer les utilisateurs et les groupes sans trop d’efforts. Dans cet article, vous verrez comment réaliser ce paramétrage.

Créer le référentiel des utilisateurs et groupes

Pour commencer, il faut créer le schéma qui représente les données de sécurité; voici un exemple avec une table USERS, une table GROUPS et une table de correspondance entre le 2 tables précédentes.

create table users (
userid number CONSTRAINT USERS_PK PRIMARY KEY,
username varchar2(128) NOT NULL CONSTRAINT USERS_NN UNIQUE,
password varchar2(128) NOT NULL);

create table groups(
groupname varchar2(128) CONSTRAINT GROUPS_PK PRIMARY KEY,
groupdesc varchar2(512));

create table user2groups(
userid number NOT NULL,
groupname varchar2(128) NOT NULL,
username varchar2(128) NOT NULL,
CONSTRAINT USER2GROUPS_PK PRIMARY KEY(userid, groupname),
CONSTRAINT USERS_FK FOREIGN KEY(userid)
REFERENCES users(userid),
CONSTRAINT GROUPS_FK FOREIGN KEY(groupname)
REFERENCES groups(groupname));

Pour les besoins de notre exemple, nous allons remplir les tables avec un utilisateur et son mot de passe (arkzoyd en MD5), ainsi que les groupes correspondants :

insert into users(userid,username,password) 
values (1, 'arkzoyd', '21F3FD3023F6C5AC711AB1121D8258D5');
insert into groups(groupname, groupdesc)
values ('USER' , 'Application Registered Users');
insert into groups(groupname, groupdesc)
values ('ADMIN', 'Application Administrator');
insert into user2groups(userid, groupname, username)
values (1, 'USER', 'arkzoyd');
insert into user2groups(userid, groupname, username)
values (1, 'ADMIN', 'arkzoyd');
commit;

Pour récupérer la valeur de HASH MD5 d’un mot de passe, vous pouvez utiliser DBMS_CRYPTO dans votre base de données Oracle comme ci-dessous :

var vhash varchar2(128);
exec :vhash := 'arkzoyd'
set serveroutput on
declare
vhraw raw(128);
vmd5 varchar2(128);
begin
vhraw:=utl_raw.cast_to_raw(:vhash);
vmd5:=DBMS_CRYPTO.HASH(vhraw, 2 /*MD5*/ );
dbms_output.put_line('MD5('''||:vhash||''')='||vmd5);
end;
/

MD5('arkzoyd')=21F3FD3023F6C5AC711AB1121D8258D5

Si vous préférez un formulaire en ligne, il existe plusieurs site web capables de répondre simplement à vos questions comme celui-ci.

Créer un Security Realm

Sélectionnez le menu « Configuration -> Security -> Realms » pour créer un nouveau « royaume ». Configurez les différentes propriétés comme ci-dessous :

  • Nom du royaume : OracleDBRealm (par exemple)
  • Nom de la classe : com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm
  • JAAS Context : jdbcRealm (attention, la casse est importante)
  • Nom JNDI de la datasource JDBC : jdbc/OracleDS
  • Nom de la table des utilisateurs : users
  • Colonne « Nom de l’utilisateur » : username
  • Colonne « Mot de passe » : password
  • Nom de la table des groupes : groups (la jointure avec la table des utilisateurs est faite via une colonne qui doit avoir le même nom de la colonne de la table utilisateur – aka username)
  • Colonne des groupes : groupname
  • Encoding : Hex

Pour ce qui est du reste, nous laisserons les valeurs par défaut.

Créer une application qui s’appuie sur le Realm

Pour développer une application web, j’utilise JDeveloper 11g. Dans un premier temps, je crée une page index.jsp qui affiche le login (JAAS) de l’utilisateur connecté :

Ensuite je mets à jour le fichier web.xml en déclarant le security Realm, les roles et nécessaires ainsi que les fichiers protégés par ces roles. JDeveloper présente une vue conviviale du fichier :

Dans mon cas, le fichier contient en réalité ce qui suit :

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">
  <display-name>JDBCRealm</display-name>
  <servlet>
    <servlet-name>index</servlet-name>
    <servlet-class>index.jsp</servlet-class>
  </servlet>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>all</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>USER</role-name>
    </auth-constraint>
  </security-constraint>
  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>OracleDBRealm</realm-name>
  </login-config>
  <security-role>
    <description>Application Users</description>
    <role-name>USER</role-name>
  </security-role>
  <security-role>
    <description>Application Administrators</description>
    <role-name>ADMIN</role-name>
  </security-role></web-app>

Enfin, avec Glassfish vous devez ajouter un fichier complémentaire qui définit la correspondance entre les groupes d’utilisateurs et les roles de l’application; il s’agit du fichier sun-web.xml que vous mettez dans le même répertoire que le fichier web.xml :
< div style="clear: both; text-align: center;">

Son contenu est le suivant :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC
  "-//Sun Microsystems, Inc.//DTD Application Server 8.1 Servlet 2.4//EN"
  "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-1.dtd">
<sun-web-app>
  <context-root>/JDBCRealm</context-root>
  <security-role-mapping>
    <role-name>USER</role-name>
    <group-name>USER</group-name>
  </security-role-mapping>
  <security-role-mapping>
    <role-name>ADMIN</role-name>
    <group-name>ADMIN</group-name>
  </security-role-mapping></sun-web-app>

Si vous voulez récupérer le fichier, JDeveloper, téléchargez le ici.

Déployer et Tester l’application

Pour finir, il suffit de déployer l’application Web après avoir créé le fichier JDBCRealm.war. Pour cela, vous pouvez utiliser le menu « Applications » de la console et de sélectionner le bouton « Deploy… ». L’application vous demande un mot de passe lorsque vous vous connectez :

Une fois le bon mot de passe utilisé (arkzoyd/arkzoyd), vous vous connecterez à la page JSP :

2 réflexions sur “Glassfish v3 et authentification via une table Oracle”

Les commentaires sont fermés.