Les exemples sont disponibles sur github
//En cours de rédation NON COMPET et non DEFINITF
L'implémentation standard du RBAC (Resource Based Access Control) dans Tomcat7 (container web j2EE)
Résumé
Cet article présente les concepts de l'implémentation du contrôle d'accès aux ressources dans le cadre des applications j2EE. Nous verrons en particulier comment configurer tomcat pour permettre la définition des utilisateurs et de leurs rôles dans différentes source de donnée (Fichier XML ou base de donnée Mysql). Présenter les différents modes de connexions pour acquérir les droits d’accès aux ressources. Présenter la méthode déclarative pour le contrôle d'accès dans les applications j2EE. Le tout a travers un exemple extrêmement simple.
RBAC ou CABR (Contrôle d'Accès Basé Rôle)
L'idée derrière le RBAC est très simple on doit pouvoir retrouver et comprendre une règle d'habilitation sur une ressource sans plonger dans le code, mais en lisant un fichier de configuration.
La sécurité peut être implémentée programmatiquement ou être déléguée au serveur d'application (web ou application container) dans notre cas Tomcat7
Configuration Tomcat7 pour le contrôle d'accès
Notion de Realm (Domaine de sécurité = ensembles utilisateurs et groupes d'utilisateurs)
Un Realm est un "base de données" de noms d'utilisateurs et mots de passe qui permettent d'identifier les utilisateurs valides d'une application web (ou un ensemble d'applications web), plus une énumération de la liste des rôles associés à chaque utilisateur valide. Vous pouvez penser aux rôles comme étant semblables à des groupes dans les systèmes d'exploitation Unix-like. Comme l'accès à des ressources d'applications web est accordée à un ensemble d'utilisateurs possédant un rôle particulier (plutôt que d'énumérer la liste des noms d'utilisateurs associés). Un utilisateur peut avoir plusieurs rôles associés à leur nom d'utilisateur.
Bien que la spécification Servlet décrit un mécanisme portable pour les applications permettant de déclarer leurs exigences de sécurité (dans le descripteur de déploiement web.xml). il n'existe pas d'API portable de l'interface entre un conteneur de servlets et l'utilisateur associé et des informations de rôle.
Dans de nombreux cas, cependant, il est souhaitable de "connecter" un conteneur de servlet à une base de données d'authentification existante ou un mécanisme qui existe déjà dans l'environnement de production. Par conséquent, Tomcat définit une interface Java (org.apache.catalina.Realm) qui peut être mis en œuvre par «plug-in» de composants pour établir cette connexion. Cinq norme plug-ins sont fournis, supportant les connexions vers diverses sources d'informations d'authentification:
Nous en décriront ici que 2:
- MemoryRealm -Accède aux informations d'authentification stockées dans une collection d'objets en mémoire, qui est initialisé à partir d'un document XML (conf/tomcat-users.xml).
- DataSourceRealm - Accède aux informations d'authentification stockées dans une base de données relationnelle, accessible via un nom JNDI représentant une source de donnée JDBC.
Les Realm par defaut de Tomcat => fichier xml tomcat-users.xml
On définie 2 notions l’utilisateur et le rôle (ou groupe d'utilisateurs), voici un exemple
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="etudiant"/>
<role rolename="prof"/>
<role rolename="admin"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script"/>
<user username="etud1" password="passetud" roles="etudiant"/>
<user username="etud2" password="passetud2" roles="etudiant"/>
<user username="pascalfares" password="passetud" roles="prof, admin"/>
//TODO Les mots de passe cryptés //TODO
Les "Raalm" basé Source de Donnée
DataSourceRealm est une implémentation de l'interface "Realm" de Tomcat qui recherche des utilisateurs dans une base de données relationnelle accessible via JDBC JNDI nommé un DataSource. La configuration est flexibilité, cette configuration vous permet de s'adapter aux tables existantes et les noms de colonnes, tant que que la structure de votre base de données est conforme aux exigences suivantes:
- Il doit y avoir une table, référencée comme la table des utilisateurs, qui contient une ligne pour chaque utilisateur valide que ce Realm doit reconnaître.
- La table d'utilisateurs doit contenir au moins deux colonnes (elle pourrait en avoit plus)
- Un champ nom utilisateur
- Un champ mot de passe
- Il doit y avoir une table, référencé en tant que table de groupe d'utilisateur, Cette table contient une ligne pour chaque rôle valable qui est attribué à un utilisateur particulier. Il est possible pour un utilisateur d'avoir zéro, un, ou plus d'une fonction (rôle) valide.
Voici un exemple de fichier sql compatible avec cette exigence
CREATE DATABASE `dbuser`
USE `dbuser`;
CREATE TABLE `user_roles` (
`user_name` varchar(15) NOT NULL,
`role_name` varchar(15) NOT NULL,
PRIMARY KEY (`user_name`,`role_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `user_roles` VALUES ('tomcat','manager-gui'),('tomcat','manager-script'), ('etud1', 'etudiants'), ('etud2', 'etudiants'), ('pascal', 'admin'), ('pascal', 'prof');
CREATE TABLE `users` (
`user_name` varchar(15) NOT NULL,
`user_pass` varchar(40) NOT NULL,
PRIMARY KEY (`user_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `users` VALUES ('pascal','pascal'),('pascalfares','pass'),('tomcat','tomcat'), ('etud', 'pass'),('etud1', 'pass1'),('etud2', 'pass2');
//Signé les password algorithme sha
replace into users (user_name,user_pass) select user_name, sha(user_pass) from users
Voici la definition de la source de donnée vest cette base de donnée
les user_pass est de taille 40 pour contenir la signature sha
Configuration des "Realm" et des sources de données dans server.xml ou ailleur
<Resource
auth="Container"
name="jdbc/DBUSER"
driverClassName="com.mysql.jdbc.Driver"
maxActive="100"
maxIdle="10"
maxWait="-1"
password="YYY"
type="javax.sql.DataSource"
url="jdbc:mysql://localhost/dbuser"
username="XXX"
validationQuery="select 1"/>
Enfin voici la déficition du réalm à placer dans server.xml
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/DBUSER"
digest="sha"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
</Realm>
L'atribut "digest" indique à tomcat qu'il faut utilisé les mot de passe cryptés