CAS-sification du Bundle d'Alfresco

vendredi 5 juin 2009

Cet article va vous aider à CAS-sifier le bundle d'Alfresco, (donc pour entamer cet article, il vous faudrait un passage forcé par ce doc :D )

CAS est un système d'authentification unique (SSO) pour le web développé par l'Université Yale, partenaire majeur dans le développement de uPortal. Ce logiciel est implanté dans plusieurs universités et organismes dans le monde.
Grâce ce type de systèmes (les SSO), on s'authentifie sur un site Web, et on est alors authentifié sur tous les sites Web qui utilisent le même serveur CAS. Il évite de s'authentifier à chaque fois qu'on accède à une application en mettant en place un système de ticket. (source)

Pour CAS-sifier votre bundle, il faudrait suivre les étapes suivantes :

1- Allez au fichier : MODULE-INF > WEB-INF > classes > alfresco > authentication-services-context.xml
a- Commentez les lignes suivantes :

<bean id="AuthenticationComponent" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

<property name="proxyInterfaces">
<value>org.alfresco.repo.security.authentication.AuthenticationComponent</value>
</property>

<property name="transactionManager">
<ref bean="transactionManager" />
</property>

<property name="target">
<ref bean="authenticationComponent" />
</property>

<property name="transactionAttributes">
<props>
<prop key="*">${server.transaction.mode.default}</prop>
</props>
</property>

</bean>


b- Décommentez les lignes suivantes :

<bean id="AuthenticationComponent"
class="org.alfresco.repo.security.authentication.SimpleAcceptOrRejectAllAuthenticationComponentImpl"
parent="authenticationComponentBase">

<property name="accept">
<value>true</value>
</property>

<property name="nodeService">
<ref bean="nodeService" />
</property>

<property name="personService">
<ref bean="personService" />
</property>

<property name="transactionService">
<ref bean="transactionService" />
</property>

</bean>


2- Allez au fichier : MODULE-INF > WEB-INF > web.xml
a- Ajoutez les lignes suivantes juste après la dernière balise context-param (en remplacant "nom_serveur" par le nom de la machine sur laquelle le bundle va être déployé, et pour le 3ème parametre, spécifiez un numero port si votre serveur en utilise un) :
<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://nom_serveur:8443/cas/login</param-value>
</init-param>

<init-param>
<param-name>
edu.yale.its.tp.cas.client.filter.validateUrl
</param-name>
<param-value>
https://nom_serveur:8443/cas/serviceValidate
</param-value>
</init-param>

<init-param>
<param-name>
edu.yale.its.tp.cas.client.filter.serverName
</param-name>
<param-value>nom_serveur:8080</param-value>
</init-param>
</filter>

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

<filter>
<filter-name>Authentication Filter</filter-name>

<filter-class>
com.keembay.alfresco.web.app.servlet.CASAuthenticationFilter
</filter-class>

<init-param>
<param-name>cas.user.label</param-name>
<param-value>
edu.yale.its.tp.cas.client.filter.user
</param-value>
</init-param>
</filter>


b- Commentez ou supprimez les lignes suivantes :

<filter>
<filter-name>Authentication Filter</filter-name>
<description>
Authentication filter mapped only to faces URLs.
Other URLs generally use proprietary means to talk to the AuthenticationComponent
</description>

<filter-class>
org.alfresco.repo.web.filter.beans.BeanProxyFilter
</filter-class>

<init-param>
<param-name>beanName</param-name>
<param-value>authenticationFilter</param-value>
</init-param>

<!--
For Novell IChain support use the following filter
<filter-class>
org.alfresco.web.app.servlet.NovellIChainsHTTPRequestAuthenticationFilter
</filter-class>
-->
</filter>

3- Ajouter la librairie "keembay-alfresco-cas.jar" téléchargeable ici, au dossier : MODULE-INF > WEB-INF > lib,

Remarque : jusqu'ici, on peut dire que votre Bundle Alfresco est CAS-sifié, une fois connecté par CAS, Alfresco crée automatiquement des utilisateurs "fictifs", c'est à dire, qu'ils n'existent pas, mais ils ont un accès très limité, et ca donne des bugs,
Pour remédier à cela, il faudrait entrer dans le code source d'Alfresco et faire quelques modifications

1ère modification :
- récuperez le code source de la classe : "NavigationBean.java" (téléchargeable ici)
- changez la visibilité de la fonction "getAuthService()" de protected vers public,
- compilez la classe,
- mettez les fichiers ".class" générés dans le Jar : MODULE-INF > WEB-INF > lib > alfresco-web-client.jar, et précisement dans le dossier : org > alfresco > web > bean
---> ces fichiers sont au nombre de 4 et se nomment :


  • NavigationBean$1.class

  • NavigationBean$2.class

  • NavigationBean.class

  • NavigationBean$NavigationBreadcrumbHandler.class


---> Astuce : utilisez un logiciel comme WinRar pour ouvrir le fichier Jar, parcourir son arborescence et faire les differentes modification nécéssaires.

2ème modification : maintenant on va créer l'utilisateur connecté, s'il n'est pas déja existant,
- Allez au fichier : MODULE-INF > jsp > parts > titlebar.jsp et ajoutez le code suivant :


NavigationBean nb=(NavigationBean)session.getAttribute("NavigationBean"); // Recuperation du bean qui contient les informations sur l'utilisateur connecté
String name=nb.getCurrentUser().getUserName(); // Recuperation du nom de l'utilisateur connecté

nb.getAuthService().authenticate("admin","admin".toCharArray()); // Accès au Service d'authentification avec l'utilisateur "admin" -> un simple utilisateur créé par CAS n'a pas le droit d'y accéder
if (!nb.getAuthService().authenticationExists(name)){ // Tester l'existance de l'utilisateur connecté
nb.getAuthService().createAuthentication(name,"123456".toCharArray()); // S'il n'existe pas alors le créer avec n'importe quel mot de passe, ce qui compte c'est le mot de passe du CAS, ceux d'Alfresco n'ont aucune utilité
}


Maintenant chaque utilisateur "fictif", devient réel, et aucun bug ne surviendra inchalah.

4- En ce qui concerne la partie déconnexion d'Alfresco, le lien "logout" vous envoi vers une page où il n'y a qu'un seul lien pour revenir à Alfresco, mais il n'y en a aucun pour se déconnecter difinitivement du CAS,
Pour remédier à ce petit problème, utilisez l'une des deux méthodes suivantes :

a- vous êtes préssés et vous voulez vous déconnecté rapidement d'Alfresco et du CAS :

¤ Ouvrez le fichier : MODULE-INF > jsp > relogin.jsp, et ajoutez la ligne suivante au début du fichier :
response.sendRedirect("https://nom_serveur:8443/cas/logout");

ceci vous fera rediriger directement vers la page de déconnexion du CAS

b- vous voulez que la déconnexion se passe en douceure, on va rendre la page vers laquelle nous redirige Alfresco (aprsè le clic sur le lien logout) comme une page de confirmation
pour ce faire on va ajouter un autre lien, en dessous de celui qui existe déja, pour inviter l'utilisateur à se déconnecter définitivement, pour cela, il suffit d'ajouter la ligne suivante à emplacement souhaité :

<a:actionlink
href="https://nom_serveur:8443/cas/logout"
value="Se déconnecter définitivement">
</a:actionlink>

et voilà, votre système est complétement CAS-sifié :)