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é :)

Création du Bundle d'Alfresco pour une application OSGi

lundi 25 mai 2009

L’OSGi Alliance (précédemment connue sous le nom de Open Services Gateway initiative) est une organisation fondée en mars 1999. L’Alliance et ses membres ont spécifié une plate-forme de services basée sur le langage java qui peut être gérée de manière distante. Le cœur de cette spécification est un framework (cadriciel) qui définit un modèle de gestion de cycle de vie d’une application, un référentiel (registry) de services, un environnement d'exécution et des modules. Basés sur ce framework, un grand nombre de couches (Layers) OSGI, d’API et de services.

Le framework implémente un modèle de composants dynamique et complet, comblant un manque dans les environnements Java/VM traditionnels. Les applications et composants (se trouvant sous la forme de bundles pour le déploiement) peuvent être installés, arrêtés, démarrés, mis à jour et désinstallés de manière distante sans nécessiter de redémarrage ; la gestion des classes/paquetages Java est spécifiée de manière très détaillée. La gestion du cycle de vie est effectuée à travers une API en appliquant une politique de gestion des téléchargements distants. Le référentiel (registry) de services permet aux bundles de détecter l’addition de nouveaux services, ou la suppression de services et de s'y adapter.

L'objectif original se focalisait sur les passerelles (gateways) de services mais sa mise en application s’est avérée bien plus étendue. Les spécifications sont désormais utilisées dans des applications allant des téléphones portables à l’IDE Eclipse (sous-projet Equinox). D’autres domaines d'application incluent les automobiles, l’automatisme industriel, les PDAs, le calcul grid, les loisirs (e.g. iPronto), la gestion de flottes et les serveurs d'applications. (source)

Plus d'informations sur ce lien


Revenons à notre gros mouton Alfresco, LoooooL

Pour pouvoir modifier tranquillement le code source d'Alfresco, il n'y a pas mieux qu'il soit en format Bundle (pour une application OSGi)
Avant de commencer cet article, vous devez avoir un WAR d'alfresco généré grâce à l'article (lien),
Une fois que vous ayez un WAR fonctionnel, il vous suffira de le déziper en utilisant un des utilitaires existants sur le marché (WinRar, WinZip, ...),

Ouvrez Eclipse, et créez un nouveau projet : Bundle Project,



Configurez votre workspace pour qu'il soit compatible avec les recommandations de SpringSource, comme le montre l'image ci dessous :



Copiez le contenu du WAR généré dans le dossier : src/main/resources/MODULE-INF, vous aurez un workspace qui ressemble à cela :



Créez le fichier MANIFEST.MF dans le fichier src/main/resources/META-INF, alimentez le en fonction des besoins de l'application (lancer le bundle sur le serveur et essayez de résoudre les dépendances dont l'application aurait besoin), ou bien vous pouvez télécharger ce fichier (ici).

Pour tester votre application, ajoutez la à Spring DM Server (sous eclipse) et démarrez votre serveur.

Dépoiement du WAR d'Alfresco sous Spring DM Server

jeudi 30 avril 2009

Alfresco est un projet de gestion de contenu d'entreprise (Donc aussi bien orienté Gestion Electronique de Documents que Gestion de Contenu Web) créé en juin 2005 par John Newton, co-fondateur de Documentum et John Powell, ancien cadre de Business Objects, apportant ainsi une grande expérience des besoins (15 ans d'expertise dans le domaine).

La mission d’Alfresco est d’ouvrir le monde de la Gestion Documentaire à travers l’open source afin d’augmenter les innovations grâce à la participation de la communauté et le libre accès au code source, et vise à fournir une application complète à moindre coût, et avec plus d'agilité.

Alfresco est un projet open-source, multi plateforme, utilisant des standards ouverts, et massivement basé sur la technologie JEE.

Alfresco a développé une architecture moderne qui utilise les derniers outils open-source pour optimiser les performances, et la Programmation Orienté Aspect (AOP) facilitant ainsi la modularité et l’adaptabilité de l’application.

Alfresco implémente la norme JSR-168 pour le déploiement dans des portails open-source tel que JBOSS Portal ou Liferay

Alfresco permet de gérer les documents électroniques au sein d’une entreprise et fournit des services de recherche et de catégorisation du contenu.

Alfresco fournit une interface d’accès aux données stockées sur des lecteurs réseaux partagés avec des règles automatiques afin de simplifier la catégorisation et l’organisation, la recherche, et le partage pour augmenter la conformité des process à travers un véritable contrôle documentaire. (source)


SpringSource dm Server ™ est complètement modulaire, basé sur un serveur OSGi Java, il est conçu pour fonctionner des applications Java d'entreprise et les applications Spring avec un nouveau degré de flexibilité et de fiabilité. SpringSource dm Server est basé sur le nouveau noyau SpringSource Dynamic Module Kernel™ (dm Kernel). Ce nouveau noyau offre un module de base pour le serveur, qui exploite la puissance de Spring, Apache Tomcat et OSGi-based technologies. (source)


En ce qui concerne le déploiement du WAR d'Alfresco sur ce fameux serveur, Le WAR proposé sur le site d'Alfresco n'est pas du tout déployable sur Spring DM Server (il ne peut être déployé que sur Apache Tomcat), surtout qu'il utilise des dépendances à mettre dans differents fichiers dans le serveur Apache Tomcat (dossiers shared et common\endorsed) et qui n'existent malheureusement pas dans Spring DM Server,

Pour résoudre le problème il nous faudrait un WAR complet et qui contient toutes les dépendances nécessaires au bon fonctionnement d'Alfresco,

Pour ce faire, il nous faudra construire un nouveau WAR à partir du code source d'Alfresco, -> l'open source c'est cooooool

étape 1 : Construction du workspace et génération du WAR

1- faites un checkout complet du code source d'Alfresco en utilisant un outil (comme SmartSVN)
Remarque : c'est mieux de ne pas utiliser SubEclipse, ca peut vous ralentir

2- suivez les étapes fournies par le lien suivant sur le wiki d'Alfresco : http://wiki.alfresco.com/wiki/Alfresco_on_Eclipse, seul changement c'est le checkout dans un dossier externe,

3- l'importation des projets dans le workspace devra être faites dans l'odre suivant :
  • 3rd-party
  • core
  • MBean
  • Deployment
  • Alfresco JLAN
  • repository
  • remote-api
  • web-service-client
  • jndi-client
  • web-client
  • webscript-framework
  • Installer
  • lang-packs
  • Extensions
  • Netbios
  • SDK : il contient plusieurs porjets, il faudrait tous les importer
  • link-validation
  • Catalina-virtual
  • Webservice-Client

Aprés l'importation des projets dans l'ordre précedent, le workspace devrai être compilé, (une erreur de compilation pourrait survenir dans le projet repository, mais elle n'aura aucune concéquence sur la suite), votre workspace devra ressembler à cela :


4- créez un nouveau projet sous eclipse (un simple projet), nommez le ANT (par exemple) et importez le fichier root/build.xml (il devrait être dans le checkout que vous avez effectué)

5- en utilisant l'outil "External tools", créez une configuration pour "Ant Build",


attribuez lui un nom, et cliquez sur "Browse Workspace" de la partie "Buildfile" et sélectionnez le fichier "build.xml",


6- cliquez sur "run", un long processus pour la compilation "Ant" sera effectué, à la fin un fichier WAR est généré, vous pouvez le récupéré dans le chemin spécifié dans la trace, où en allant directement vers le fichier C:\Tomcat\webapps


étape 2 : déployement du WAR sous Spring DM Server

1- mettez le WAR d'Alfresco (celui généré dans l'étape précédente) dans le dossier "pickup" du serveur Spring DM,

2- avant de lancer le serveur Spring DM, il faut vérifier les choses suivantes :

a- la base de données "Alfresco" est créée (voir le script de génération de la BD dans le lien http://wiki.alfresco.com/wiki/Alfresco_on_Eclipse),

b- il faudrait auguementer la taille de la mémoire allouée à la JVM pour Spring DM Server -> Alfresco est très gourmant,

  • si vous voulez lancer Spring DM Server depuis la console, ouvrez le fichier startup.bat pour windows (resp. startup.sh pour linux) et ajoutez "-Xms256m -Xmx512m -XX:MaxPermSize=128m" dans la variable "JAVA_OPTS"
  • si vous voulez lancer Spring DM Server depuis Eclipse, allez à la configuration de lancement du serveur (double-clic sur le serveur + open lunch configuration) et ajoutez les même données dans la zone "VM Arguments" de l'onglet "Arguments"


3- Lancez votre serveur, attendez que le WAR soit déployé et ouvrez votre browser pour tester Alfresco (http://localhost:8080/alfresco)