Technologies

JASIG CAS et persistance JPA

Publié le : Auteur: Emmanuel Lesne Laisser un commentaire
technologies

Dans le cadre d’une de mes missions, mon client souhaitait améliorer la disponibilité de son infrastructure SSO basé sur JASIG CAS. Avec 1 unique serveur SSO, celle-ci n’était pas très élevée.

Pour rappel, ce produit open-source gère les accès (identification et authentification) en un point unique du SI. Les applications lui demande des tickets d’identification puis de services  afin de valider les accès utilisateurs.

Pour répondre au besoin de mon client, j’ai opté pour la persistance des tickets en base de données. Cette fonctionnalité est offerte par le registre des tickets JPA (cf. https://wiki.jasig.org/display/CASUM/JpaTicketRegistry).

Ce choix a été fait en regard des avantages suivants:

  • suivi des tickets en temps réel depuis la base
  • configuration principalement restreinte à l’application CAS
  • reprise des tickets en cas d’arrêt d’un serveur

Le principal inconvénient est la nécessité d’installer une base de données. Celle-ci étant déjà présente, ce point fût levé rapidement.

Avant de rentrer dans des explications plus techniques, voici le schéma global de l’architecture cible:

Architecture globaleUn paramètre important est le serveur d’application qui héberge toutes les applications et le SSO: JBoss AS 7.1.

Donc pour mettre en œuvre le registre JPA, il convient de suivre globalement la procédure d’installation décrite dans la documentation. Malheureusement, sous Jboss AS 7.1, la procédure aboutit à des conflits importants de bibliothèque hibernate.

D’après la documentation, les étapes de mise en œuvre de la persistance des tickets organisées en 5 points:

  1. Configuration du fichier ticketRegistry.xml: Spring Configuration (ticketRegistry.xml)
  2. Ajout de la dépendance Maven à hibernate: Configuring JPA Dependencies

Dans notre cas, il ne faut pas faire les 3 derniers points:

  1. Configuration de la base: Database Configuration
  2. Configuration du pool: Database Connection Pooling
  3. Adpatation DB: Platform-Specific Considerations

Mon objectif principal est de déléguer un maximum de points à JBoss AS. Pour cela, je choisis de :

  • utiliser une DataSource déclarée au niveau Serveur JBoss
  • déléguer la création de la Factory de l’ EntityManager JPA à JBoss.

Ces 2 points permettent d’éviter ces conflits de librairies hibernate !

Complément Initial: DataSource

Au préalable, j’ajoute une Datasource, dans mon exemple Oracle, dans JBoss. Pour un mode standalone, ajouter le fichier cas-ds.xml dans §JBOSS_HOME/standalone/deployments/

                <datasource jndi-name="java:/datasources/CasDS" pool-name="CasPool" enabled="true" use-java-context="true">
                        <connection-url>jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:WEB02</connection-url>
                        <driver>oracle</driver>
                        <pool>
                            <min-pool-size>0</min-pool-size>
                            <max-pool-size>20</max-pool-size>
                            <prefill>true</prefill>
                        </pool>
                        <security>
                            <user-name>user</user-name>
                            <password>password</password>
                        </security>
                    </datasource>

Pour une configuration par domaine, celle-ci doit être ajoutée dans le fichier $JBOSS_HOME/domain/configuration/domain.xml.

Complément Etape 1: Spring Configuration (ticketRegistry.xml)

Pour que Spring délègue la création de la fabrique de l’entity manager, il faut :

1. Compléter l’unité de persistance JPA mise en œuvre par CAS. Elle se trouve dans WEB-INF/META-INF/persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
        version="2.0">

    <persistence-unit name="CasPersistence" transaction-type="RESOURCE_LOCAL">
        <non-jta-data-source>java:/datasources/CasDS</non-jta-data-source>

        <class>org.jasig.cas.services.RegisteredServiceImpl</class>
        <class>org.jasig.cas.ticket.TicketGrantingTicketImpl</class>
        <class>org.jasig.cas.ticket.ServiceTicketImpl</class>
        <class>org.jasig.cas.ticket.registry.support.JpaLockingStrategy$Lock</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
            <property name="hibernate.show_sql" value="true"/>
        </properties>
    </persistence-unit>
</persistence>

Les propriétés suivantes sont nécessaires:

  • hibernate.dialect: dialect de la base Oracle,
  • hibernate.hbm2ddl.auto: créaion automatique des tables dans Oracle
  • hibernate.show_sql: trace SQL produites (positionner à false en production).

2. déclarer l’unité de persistance JPA au niveau de l’application. Ajouter la ref suivante dans le fichier web.xml:

<persistence-unit-ref>
    <persistence-unit-ref-name>persistence/CasPersistence-emf</persistence-unit-ref-name>
    <persistence-unit-name>CasPersistence</persistence-unit-name>
</persistence-unit-ref>

3. remplacer le bean entityManagerFactory dans ticketRegistry.xml par

<jee:jndi-lookup id="entityManagerFactory" jndi-name="java:comp/env/persistence/CasPersistence-emf"
 expected-type="javax.persistence.EntityManagerFactory"/>

Suite des opérations

Les points de configuration spécifiques à la configuration et l’adaptation de la base (de 3 à 5) sont faits dans la DataSource et le fichier persistence.xml.

Sécurisation des cookies

Dans le cadre d’une mise en production, ne pas oublier de sécuriser les cookies générés par CAS.

Fichier WEB-INF/spring-configuration/warnCookieGenerator.xml

<bean id="warnCookieGenerator"
  p:cookieSecure="true"
  p:cookieMaxAge="-1"
  p:cookieName="CASPRIVACY"
  p:cookiePath="/cas"
  p:cookieDomain="client.com"/>

Fichier WEB-INF/spring-configuration/ticketGrantingCookieGenerator.xml

<bean id="ticketGrantingTicketCookieGenerator"
  p:cookieSecure="true"
  p:cookieMaxAge="-1"
  p:cookieName="CASTGC"
  p:cookiePath="/cas"
  p:cookieDomain="client.com" />

Vérification

Les tickets sont maintenant inscrits dans la base de données par les 2 serveurs.

Les tables SERVICETICKET, TICKETGRANTINGTICKET et REGISTEREDSERVICEIMPL sont crées automatiquement lors du déploiement de l’application CAS sur le serveur JBoss.

La table TICKETGRANTINGTICKET liste donc tous les tickets correspondant à une identification SSO.