wiki:ProtegerApplicationJavaAvecCas

Protéger une application Java avec CAS

TOC?

Introduction

Il existe une librairie Java pour forcer une authentification sur CAS avant l'utilisation d'une application web. Elle comporte tous les éléments pour exploiter toutes les possibilités de CAS. Nous allons détailler ici la configuration du filtre inclus dans la librairie.

Fonctionnement global

Le filtre CAS agit avant l'accès à l'application. Il vérifie si l'utilisateur s'est déjà correctement authentifié et requiert une authentification sur le serveur CAS si besoin est. Lors de l'exécution de la suite de la chaine de filtres, l'utilisateur sera considéré comme authentifié.

Filtre CAS (fonctionnement global)

Librairie requise

Un client pour les applications Java est disponible en  téléchargement. Il contient les classes nécessaires à la communication avec CAS, mais aussi des filtres et des taglibs pour JSP.

Une dépendance pour les projets Maven est aussi disponible :

<dependency>
    <groupId>cas</groupId>
    <artifactId>casclient</artifactId>
    <version>2.1.1</version>
 </dependency>

Configuration du filtre (mode normal)

Le filtre s'applique dans le fichier de configuration web.xml de l'application. L'exemple ci-dessous montre une configuration en mode normal (non proxy).

<web-app>
    ...

    <filter>
        <filter-name>CAS Filter</filter-name>
        <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
        <init-param>
           <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
           <param-value>https://auth.example.com/login</param-value>
        </init-param>
        <init-param>
           <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
           <param-value>https://auth.example.com/serviceValidate</param-value>
        </init-param>
        <init-param>
           <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
           <param-value>service.example.com</param-value>
        </init-param>
        <init-param>
            <param-name>edu.yale.its.tp.cas.client.filter.wrapRequest</param-name>
            <param-value>true</param-value>
    </filter>
 
    <filter-mapping>
        <filter-name>CAS Filter</filter-name>
        <url-pattern>/pages-protegees/*</url-pattern>
    </filter-mapping>

    ...
</web-app> 

Pour protéger entièrement une application, il faut changer le mapping du filtre et l'appliquer à toutes les pages du site :

<filter-mapping>
    <filter-name>CAS Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Les paramètres du filtre

Paramètres requis

Nom du paramètre Description
edu.yale.its.tp.cas.client.filter.loginUrl URL de login sur serveur CAS, comme https://auth.example.com/login
edu.yale.its.tp.cas.client.filter.validateUrl URL de validation d'un ticket, comme https://auth.example.org/serviceValidate. Si vous souhaitez recevoir des tickets PGT, utilisez plutôt https://auth.example.org/proxyValidate.
edu.yale.its.tp.cas.client.filter.serverName Nom d'hôte du serveur actuel (exemple : service.example.org). Ce paramètre est requis si serviceUrl n'est pas défini.
edu.yale.its.tp.cas.client.filter.serviceUrl Ce paramètre remplace serverName. C'est l'URL sur laquelle CAS vous redirige après identification. Si vous avez un point d'entrée spécifique pour l'application web, définissez l'URL.

Paramètres optionnels

Nom du paramètre Description
edu.yale.its.tp.cas.client.filter.wrapRequest Ce paramètre encapsule le nom de l'utilisateur dans l'objet Request s'il est défini à true. On peut donc utiliser la méthode getRemoteUser() pour obtenir son nom.
edu.yale.its.tp.cas.client.filter.proxyCallbackUrl URL de callback de l'application, utilisée pour obtenir un PGT. Cette URL correspond généralement à l'URL de la servlet ProxyTicketReceptor.
edu.yale.its.tp.cas.client.filter.authorizedProxy Liste des URL de proxies valides, séparés par des espaces
edu.yale.its.tp.cas.client.filter.renew Force une nouvelle identification contre le serveur CAS. Utile pour des applications à haut niveau de sécurité.

Consommer les résultats de l'authentification

Deux variables de session sont initialisées après une authentification réussie :

Nom de la variable de session Constante Java Description
edu.yale.its.tp.cas.client.filter.user CASFilter.CAS_FILTER_USER Nom de l'utilisateur
edu.yale.its.tp.cas.client.filter.receipt CASFilter.CAS_FILTER_RECEIPT Objet contenant le nom de l'utilisateur ainsi que d'autres informations

Une application Java peut ensuite accéder à ces informations de la manière suivante :

String username;
username =  session.getAttribute("edu.yale.its.tp.cas.client.filter.user");
username =  session.getAttribute(CASFilter.CAS_FILTER_USER); // Equivalent à la ligne précédente

Recevoir des proxy granting tickets (PGT)

La servlet ProxyTicketReceptor reçoit les tickets PGT en provenance du serveur CAS. L'exemple suivant montre un extrait de la configuration du descripteur web.xml :

<web-app>
    ...

    <servlet>
        <servlet-name>ProxyTicketReceptor</servlet-name>
        <servlet-class>edu.yale.its.tp.cas.proxy.ProxyTicketReceptor</servlet-class>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>ProxyTicketReceptor</servlet-name>
        <url-pattern>/CasProxyServlet</url-pattern>
    </servlet-mapping>

    ...
</webapp> 

Conclusion

En utilisant les filtres du client CAS pour Java, on peut protéger très facilement son application web. Par contre, cette librairie ne prend pas en compte les besoins d'autorisation : ils sont laissés à la charge de l'application.

Des besoins plus complexes peuvent être exprimés en utilisant  Acegi Security, un framework dédié aux aspects sécurité des applications web Java. Mais si vous considérez Acegi comme une solution trop complexe, vous pouvez toujours créer un nouveau filtre, s'intercalant entre le filtre CAS et l'application, qui s'occupe de la gestion des droits en fonction du nom d'utilisateur.

Sur le web

Attachments