Java & le web
x Le web dynamique
x Java & le web

Intro à Tomcat
x Serveur d'applications
x Présentation Tomcat
x Installation
x Arborescence

Configuration
x Introduction
x Server
x Service
x Engine
x Host
x Context
x DefaultContext
x Logger
x Loader
x Realm
x Valve

Connecteurs
x Balise Connector
x Coyote HTTP/1.1

Sécurisation accès
x La balise Realm
x Memory Based
x JDBC Database
x Protéger ressources
x Cryptage password

Les Valve
x La balise Valve
x Access Log
x Single Sign-On

Fonctionnalités
x Déploiement auto.
x Class loaders

Eclipse & Tomcat
x Plug-in pour Eclipse
x Projet Tomcat
x Debugger des JSP

Créer une appli web
x Présentation
x Architecture
x Fichier web.xml
x Déploiement

Tomcat 5
x Nouveautés

Tomcat's Corner
x Crédits
x Liens
 
             
JDBC Database Realm

 

 

Présentation

Il s'agit d'un Realm qui stocke la liste des utilisateurs dans une base de données JDBC, c'est-à-dire une système de base de données possédant un connecteur JDBC, donc accessible en Java. Lorsqu'il est sollicité, ce Realm cherche les utilisateurs dans cette base.

 

 

Configuration

Pour utiliser ce Realm, on spécifie dans le fichier de configuration une balise Realm à laquelle on fournira comme attribut className la valeur "org.apache.catalina.realm.JDBCRealm". Un Realm peut être inséré comme balise fille d'un Engine, d'un Host ou d'un Context. Un Realm défini à un niveau inférieur (exemple : Context) écrase localement l'éventuel Realm du niveau supérieur (exemple : Host).

Le JDBC Database Realm accepte les attributs obligatoires suivants dans la balise Realm :

Nom Description
connectionName Le nom d'utilisateur pour établir la connexion JDBC avec la base.
connectionPassword Le mot de passe pour cet utilisateur.
connectionURL L'URL de connexion pour accéder à la base adéquate. Cette URL est dépendante du SGBD utilisé.
driverName Nom complet (paquetages puis classe) de la classe Java du driver à utiliser.
roleNameCol Nom de la colonne de la table des "rôles" qui contient le nom du rôle affecté à un utilisateur. (voir plus bas)
userCredCol Nom de la colonne de la table des "utilisateurs" qui contient le mot de passe d'un utilisateur. (voir plus bas)
userNameCol Nom de la colonne qui, dans les tables des "rôles" et des "utilisateurs" contient le nom d'un utilisateur. (voir plus bas)
userRoleTable Nom de la table des "rôles", qui devra contenir les colonnes définies dans les attributs userNameCol and roleNameCol.
userTable Nom de la table des "utilisateurs", qui devra contenir les colonnes définies dans les attributs userNameCol et userCredCol.

Les attributs optionnels suivants peuvent également être utilisés :

Nom Description
debug Définit le niveau de debugging pour ce composant.
digest L'algorithme de "digest" utilisé, lorsque les mots de passe sont stockés cryptés. Cet algorithme doit être l'un de ceux reconnus par la classe java.security.MessageDigest : SHA, MD2, or MD5. Par défaut (si cet attribut n'est pas spécifié), les mots de passe sont considérés stockés en texte simple.

 

On pourra donc configurer ainsi un MemoryBasedRealm dans un Host du fichier de configuration :

<Host ... >
     <Context ...>
     ...
     </Context>

     <Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authentication"
connectionName="appli" connectionPassword="toto"
userTable="users" userNameCol="user_name" userCredCol="user_password"
userRoleTable="user_roles" roleNameCol="role_name" debug="99"/>

</Host>

Format de la base de données

Le JDBC Database Realm utilise donc une base de données pour stocker les utilisateurs. Cette base doit contenir au moins deux tables :

1) La table des "utilisateurs" (déjà évoquée dans les attributs de configuration), destinée à contenir un enregistrement par utilisateur que le Realm doit permettre d'authentifier. Elle contiendra au moins deux colonnes : une pour le login, une pour le mot de passe. Le nom de la table et le nom des colonnes doit être spécifié dans la configuration.

2) La table des "rôles" (déjà évoquée dans les attributs de configuration), destinée à contenir un enregistrement par association login / rôle. Comme nous l'avons déjà expliqué, un utilisateur peut avoir plusieurs rôles. Donc, il est tout à fait possible d'avoir plusieurs enregistrements avec le même login, ou avec le même rôle (pas les deux). Un utilisateur peut avoir un, plusieurs ou aucun rôle. La clé primaire de cette table peut être définie comme le couple login, rôle. On l'aura compris, cette table doit contenir au moins deux colonnes : une pour le login, une pour le nom du rôle. Le nom de la table et le nom des colonnes doit être spécifié dans la configuration.

Voici donc un exemple de création de tables pour un JDBC Database Realm. Ces requêtes fonctionnent avec MySQL par exemple, mais doivent être adaptées en fonction du SGBD utilisé.

create table users
(
     user_name     varchar(15) not null primary key,
     user_password varchar(15) not null
);

La création de la table des "utilisateurs" est bien conforme à ce que nous attendions, en fonction de notre configuration exemple donnée plus haut et du format à respecter, expliqué ci-dessus. A présent, créons la table des "rôles" :

create table user_roles
(
     user_name varchar(15) not null,
     role_name varchar(15) not null,
     primary key(user_name, role_name)
);