Documentation:L'authentification unique avec CAS

Un article de AlfrescoWiki.

Sommaire

[modifier] CASification d'Alfresco

Ce document décrit comment modifier Alfresco pour le rendre compatible avec CAS.

Outils utilisés :

Alfresco utilise Acegi pour la partie authentification/autorisation. Acegi devrait permettre l'authentification via CAS, mais je n'ai pas réussi à comprendre comment le mettre en place.

[modifier] Certificats

[modifier] Tomcat en SSL

Un peu de doc : http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html

[modifier] JVM et CAS

Pour le client CAS, il est obligatoire que la JVM connaisse le certificat utilisé par le serveur CAS pour établir la connexion SSL. C'est obligatoire pour valider un ticket entre le client et le serveur. Pour ajouter le certificat du serveur CAS dans le keytool de la JVM :

# export (vers le fichier CAS.bin.export) du certificat depuis le keytool de tomcat utilisé par le serveur CAS
keytool -export -keystore /chemin/vers/fichier.keystore -alias mon_alias -storepass serverks -file CAS.bin.export

# import (depuis le fichier CAS.bin.export) dans la JVM utilisé par le client CAS, le mot de passe par défaut du keytool de la JVM est : changeit
keytool -import -alias mon_alias -file CAS.bin.export -keystore $JAVA_HOME/jre/lib/security/cacerts


[modifier] Ajout du client CAS dans Alfresco

Il faut télécharger l'implémentation Yale du client Java ici et placer le fichier casclient.jar dans le dossier tomcat/shared/lib/.

[modifier] Modification dans Alfresco

[modifier] web.xml

Le fichier web.xml permet de définir une suite de filtre à appliquer lors de l'authentification.

  • récupérer le fichier web.xml
  • faire une sauvegarde de l'ancien fichier web.xml
  • placer ce fichier dans tomcat/webapps/alfresco/WEB-INF
  • modifier les URLs pour le filtre Authentication Filter, ces URLs doivent pointer vers le serveur CAS (et doivent correspondre au nom de domaine donné dans les certificats)

[modifier] relogin.jsp

Il faut ajouter une redirection (response.sendRedirect) vers la page de logout du serveur CAS au tout début du code java. Ceci permet un Single Sign-Off primaire.

On va donc éditer le fichier tomcat/webapps/alfresco/jsp/relogin.jsp et ajouter les lignes suivantes :

// deconnexion CAS
response.sendRedirect("https://serveur_cas:8443/cas/logout");

ici (ligne 38 environ):

...
<%@ page isELIgnored="false" %>

<%
// deconnexion CAS
response.sendRedirect("https://serveur_cas:8443/cas/logout");
// remove the username cookie value if explicit logout was requested by the user
...

[modifier] CasAuthenticationFilter.java

Le fichier CasAuthenticationFilter.java est un nouveau filtre basé sur NovellIChainsHTTPRequestAuthenticationFilter.java. Il faut également remplacer la classe BaseServlet, car la valeur de ARG_TICKET entre en conflit avec la variable ticket utilisé par CAS. Pour résoudre le problème, on peut changer la valeur de ARG_TICKET.

  • récupérer les fichiers java :
  • placer ces fichiers au bon endroit dans les sources Alfresco
  • les compiler
  • copier les fichier .class générés dans tomcat/webapps/alfresco/WEB-INF/classes/org/alfresco/web/app/servlet


[modifier] cas-context.xml

Puisque l'authentification se fait par CAS et plus par Alfresco, il faut dire à Alfresco d'accepter tout le monde. Cela se fait très simplement en ajoutant le fichier cas-context.xml suivant dans tomcat/shared/classes/alfresco/extension/ :

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>
    <!-- Simple Authentication component that rejects all authentication requests -->
    <!-- Use this defintion for Novell IChain integration.                        -->
    <!-- It should never go to the login screen  so this is not required          -->
    
    <bean id="authenticationComponent" class="org.alfresco.repo.security.authentication.SimpleAcceptOrRejectAllAuthenticationComponentImpl">
        <property name="accept">
            <value>true</value>
        </property>    
    </bean>
</beans>