Serveur GlassFish Tips

De Wiki de Romain RUDIGER
Aller à : navigation, rechercher


Authentification des utilisateurs par une base de données MySQL avec JDBC realm

Le but de cette partie est de décrire comment authentifier des utilisateurs en utilisant un formulaire, des rôles ainsi qu'une base de données.

Serveurs :

  • Application : Sun Java System Application Server 9.1_02 (build b04-fcs)
  • MySQL : 5.0.32-Debian_7etch5-log

Logiciels optionnels :

  • NetBeans IDE 6.1
  • phpMyAdmin 2.9.1.1-Debian-6

Création des tables

Dans une base de données qui sera pour cet exemple : HCS, exécutez ceci :

CREATE TABLE `GROUPTABLE` (
  `USERID` varchar(32) NOT NULL,
  `GROUPID` varchar(32) NOT NULL,
  PRIMARY KEY  (`USERID`,`GROUPID`)
);

CREATE TABLE `USERTABLE` (
  `USERID` varchar(32) NOT NULL,
  `PASSWORD` varchar(32) NOT NULL,
  PRIMARY KEY  (`USERID`)
);

INSERT INTO `GROUPTABLE` (`USERID`, `GROUPID`) VALUES ('admin', 'ADMINISTRATORS');
INSERT INTO `USERTABLE` (`USERID`, `PASSWORD`) VALUES ('admin', '21232f297a57a5a743894a0e4a801fc3');

Nous avons donc un utilisateur admin avec le mot de passe admin haché en MD5, cet utilisateur appartient au groupe ADMINISTRATORS. Ce sont les tables nécessaires pour cet exemple, je vous laisse le plaisir d'en créer d'autres pour votre application.

Configuration du serveur GlassFish

Téléchargez le driver MySQL, pour moi c'est la version : 5.1.6 disponible ici. Mettre le driver (mysql-connector-java-5.1.6.jar) dans le dossier lib de GlassFish.

Dans la console d'administration, par défaut : http://localhost:4848/ avec l'identifiant admin et le mot de passe adminadmin.

  • Dans la section Resources > JDBC > Connection Pools :
cliquez sur new
Step 1 :
  • Name = MySQLPool
  • Resource Type = javax.sql.DataSource
  • Database Vendor = MySQL
Step 2 :
Changez ou ajoutez ces propriétés (attention, si vous utilisez un driver différent ou une version différente, regardez la documentation):
  • Url = jdbc:mysql://**.novalan.fr:3306/HCS (jdbc:mysql://[host][,failoverhost...][:port]/[database])
  • user = ***
  • password = ***
cliquez sur FINISH
  • Dans la section Resources > JDBC > JDBC Resources :
cliquez sur new
  • JNDI Name = jdbc/mysql
  • Pool Name = MySQLPool
  • Status : Enabled
cliquez sur OK
  • Dans la section Configuration > Security > Realms :
Authentification des utilisateurs par une base de données MySQL avec JDBC realm 1.JPG
cliquez sur new
  • Name = userAuth
  • Class Name = com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm
  • JAAS context = jdbcRealm
  • JNDI = jdbc/userauth
  • User Table = USERTABLE
  • User Name Column = USERID
  • Password Column = PASSWORD
  • Group Table = GROUPTABLE
  • Group Name Column = GROUPID
  • Digest Algorithm = MD5
cliquez sur OK

Configuration de l'application

Nous allons configurer l'application pour restreindre une zone qu'aux utilisateurs ayant un rôle d'administrateur.

Dans le fichier web.xml, ajoutez :

    <security-role>
        <description/>
        <role-name>ADMINISTRATORS</role-name>
    </security-role>
    <security-constraint>
        <display-name>AdminConstraint</display-name>
        <web-resource-collection>
            <web-resource-name>Admin</web-resource-name>
            <description/>
            <url-pattern>/secureAdmin/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>HEAD</http-method>
            <http-method>PUT</http-method>
            <http-method>OPTIONS</http-method>
            <http-method>TRACE</http-method>
            <http-method>DELETE</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>ADMINISTRATORS</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>userAuth</realm-name>
        <form-login-config>
            <form-login-page>/login.jsp</form-login-page>
            <form-error-page>/loginError.html</form-error-page>
        </form-login-config>
    </login-config>

Le dossier secureAdmin et ce qu'il contient est maintenant protégé, il faut préciser le formulaire pour se connecter, une page d'erreur ainsi qu'un mapping entre le rôle ADMINISTRATORS et le groupe ADMINISTRATORS. Ajoutez dans le fichier sun-web.xml :

  <security-role-mapping>
    <role-name>ADMINISTRATORS</role-name>
    <group-name>ADMINISTRATORS</group-name>
  </security-role-mapping>

Création du formulaire et d'une page de test

Dans le dossier web, créez un fichier login.jsp avec :

<%-- 
    Document   : login
    Created on : Jul 15, 2008, 5:38:23 PM
    Author     : romain.rudiger
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %>      
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>page de login</title>
    </head>
    <body>
        <h2>page de login</h2>
               <form action="j_security_check" method="POST">
              utilisateur : <input type="text" name="j_username"><br>
              mot de passe : <input type="password" name="j_password">
              <input type="submit" value="Login">
          </form>
    </body>
</html>

Dans le dossier web, créez un fichier loginError.html avec :

<%-- 
    Document   : loginError
    Created on : Jul 15, 2008, 5:40:33 PM
    Author     : romain.rudiger
--%>

<html>
    <head>
        <title>Erreur lors de la connection</title>
    </head>
    <body>
        <h1>Erreur lors de la connection !</h1>
        <br/>
    </body>
</html>

Dans le dossier web\secureAdmin, créez un fichier pageAdmin.html avec :

<%-- 
    Document   : pageAdmin
    Created on : Jul 15, 2008, 5:45:18 PM
    Author     : romain.rudiger
--%>

<html>
   <head>
      <title>Zone d'administration sécurisée</title>
   </head>
   <body>
      <h1>Zone d'administration sécurisée</h1>
   </body>
</html>

Test

Déployez votre application, n'oubliez pas de relancer le serveur GlassFish et accédez a cette page : secureAdmin/pageA.html, si tout se passe bien vous serez redirigé sur la page login.jsp.

Si vous rencontrez une erreur, regardez les messages d'erreurs et changez le niveau du Logger security.

Autres liens sur ce sujet

JDBCRealm in GlassFish with MySQL

JDBCRealm in GlassFish

Mort Learns JDBC Realm Authentication for GlassFish

Ajout d'une bibliothèque

Ajouter la bibliothèque dans le dossier glassfish-v2ur2\domains\votre_domaine\lib\ext.

Si votre bibliothèque utilise une dll, placer ce fichier dans le même dossier.

Erreur possible : java.lang.UnsatisfiedLinkError: no phidget21 in java.library.path

Changer la langue de la console d'administration de GlassFish

En utilisant Netbeans, aller dans Services > Servers > GlassFish > JVMs, clique droit propriétés :

Authentification des utilisateurs par une base de données MySQL avec JDBC realm 2.JPG

il faut ajouter dans le champ JVMOptions : -Duser.language=en

Voila un redémarrage de Glassfish s'impose tout de même.