Sécuriser une application JEE avec JDBCRealm

2 Nov

Si vous etes en train de développer une application JEE et que vous cherchez à mettre un mécanisme de gestion de la sécurité, pensez à JAAS.

Java Authentication and Authorization Service est un standard de java permettant de gérer des identifications et les droits associés par groupe au niveau du client et du serveur d’application. Il permet une séparation entre le système d’authentification /autorisation et votre code applicatif.

Dans ce poste, je vous introduis d’une manière aisée la configuration et la prise en main de l’API Jaas avec JDBCRealm sur le serveur d’application de référence Glassfish v3.

Tout d’abord, commençons par définir les groupes :

Glassfish reconnaît le rôle d’un utilisateur et son mot de passe en se basant sur deux tables avec un identificateur unique qui représente l’id de l’utilisateur (le username). Soit :

create table user (username varchar(20) not null primary key, password varchar(20) not null);
create table group (username varchar(20) not null primary key, role  varchar(20) not null);

Une autre alternative se présente dans le cas où vous avez lié ces deux tables par une clé étrangère (chose qui est plus correcte) est de créer un view afin de faciliter à Glassfish de trouver le rôle d’un utilisateur en se basant sur son username.

create table user (username varchar(20) not null primary key, password varchar(20) not null,
roleId integer not null);
create table group (id integer not null primary key, role  varchar(20) not null);
alter table user  add FOREIGN KEY (roleId ) refrences group (id);
Create view user_role as select u.username, u.password, g.role from user u, group g where g.id=u.roleId ;

Ensuite, vous devez créer une JDBC Connection Pool depuis l’interface d’administration de Glassfish :
Allez vers Resources > JDBC > JDBC Connection Pool et cliquer sur « new ».
Supposons que vous utilisez une base de type Mysql, vous pouvez faire ceci :
 

 
Ensuite « Next » :
Vous n’avez qu’à remplir les champs : User, Password, DatabaseName et Url puis cliquer sur « Finish ».
Vous devez maintenant déclarer une nouvelle ressource JNDI pour ce pool de connection.
Allez vers Resources > JDBC > JDBC Resources et cliquer sur « new ».
Dans la case JNDI name vous devez entrer un nom JNDI valide pour votre Pool de connection.
 

 
Maintenant que vous avez terminé avec la déclaration de votre ressource JNDI, allons vers des choses sérieuses.
Commençons par créer un Realm associée à notre Pool de connection.
Allez vers Configurations > server-config > Security > Realms et cliquer sur « new » :
Nommé votre nouvelle Realm par « data-jdbcrealm » et choisissez
« com.sun.entreprise.security.auth.realm.jdbc.JDBCRealm » comme Class Name.
Si vous avez choisit la première technique (les deux tables avec un username unique) vous devez remplir ce formulaire comme suit :
 

 
Dans le cas ou avez déjà les deux tables et que vous avez créé un view alors le formulaire devient :
 

 

Finis avec la configuration du serveur Glassfish, passons au fichier web.xml.
Pour activer le module Login pour votre application vous devez ajouter ce bout d’xml dans votre descripteur web.xml :
Si vous voulez fournir votre propre page de login, la configuration serait comme suit :
 

<login-config>
        <auth-method>FORM</auth-method>
        <realm-name> data-jdbcrealm </realm-name>
        <form-login-config>
            <form-login-page>/faces/login.xhtml</form-login-page>
            <form-error-page>/faces/loginError.xhtml</form-error-page>
        </form-login-config>
   </login-config>

 
Si vous voulez utiliser la façon basic (le popup) la configuration est alors :
 

<login-config>
        <auth-method>BASIC</auth-method>
        <realm-name> data-jdbcrealm </realm-name>
 </login-config>

 
Dans le cas où vous avez choisi la solution FORM, vous devez écrire une page de login login.xhtml comme suit :
 

<form method="POST" action="j_security_check">
                Username: <input type="text" name="j_username" />
                <br />
                Password: <input type="password" name="j_password" />
                <input type="submit" value="Login" />
                <input type="reset" value="Reset" />
</form>

 
Terminé avec l’authentification, passons à l’autorisation.
Vous pouvez sécuriser vos ressources en se basant sur la structure de votre URL comme suit :
Ajouter ce bout d’xml dans votre descripteur web.xml :
 

<security-constraint>
        <web-resource-collection>
            <web-resource-name>Admin</web-resource-name>
            <url-pattern>/faces/admin/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>ADMIN</role-name>
        </auth-constraint>
    </security-constraint>
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>User</web-resource-name>
            <url-pattern>/faces/user/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>ADMIN</role-name>
            <role-name>USER</role-name>
        </auth-constraint>
    </security-constraint>

 
Et n’oubliez pas de mapper ces Rôles à ceux de la table groupe dans votre fichier glassfish-web.xml :
 

<security-role-mapping>
        <role-name>ADMIN</role-name>
        <group-name>admin</group-name>
</security-role-mapping>
<security-role-mapping>
        <role-name>USER</role-name>
        <group-name>user</group-name>
</security-role-mapping>

 
Ce tuto vous montre comment activer l’authentification et l’autorisation en utilisant JDBCRealm avec Glassfish. Pour plus de sécurité vous devez utiliser les annotations javax.annotation.security dans vos managed beans et vos Ejbs.

Publicités

Une Réponse to “Sécuriser une application JEE avec JDBCRealm”

  1. mohamed orchi juin 30, 2014 à 2:26 #

    Bonjour sabri,
    j’ai le problème suivant; quand je fais l’authentification via file, ça marche très bien ,mais moi je veux que ça soit via JDBCRealm, et même si j’ai bien suivis les étapes dans ce tuto, et que j’ai configurer mon realm « authentifrealm ». mais le problème est que l’authentification passe toujours via file ,voila l’exception:  » WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Failed file login for xulo. »
    Merci pour le tuto.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :