Groupe 1A (socle)

Date de création : 31 janvier 2004
Dernière modification : 25 octobre 2004
Diffusion : internet

Personnalisation d'une quick install uPortal

Ce document décrit comment personnaliser une quick-install d'uportal pour fonctionner le plus près possible d'un environnement 'esup-portail'.

Il n'est pas destiné à un environnement de production esup-portail.

Les modifs concernent en particulier les points suivants :

Il est devenu un peu obsolète, certaines procédures ayant changées à parir des releases 2.3 d'uportal.

Il part de la quick install linux déja documentée. Il est très facile de l'extrapoler vers la quick install windows.
Comme cette dernière installation, les modifications proposées ne nécessitent pas un accès root.

La doc est liée à une installation de développement de Nancy 2. L'adaptation vers un environnement différent ne devrait pas être trop compliqué.

Les objectifs sont les suivants :

Donc, le pré-requis est la quick install uportal sur linux, tel que documenté.

Un 'package' reprenant l'installation quick-install d'uPortal et ajoutant les personnalisations esup-portail est proposé sur ce site. Il est installable sur Windows et Linux.

Les chapitres sont les suivants :

On va ajouter fonctionnalité par fonctionnalité, avec validation de chaque phase. Il est possible de ne pas installer l'une ou l'autre des fonctionnalités.

Modifications de l'environnement

Debugging à distance et certificats

Le script start.sh est modifié afin de permetre éventuellement de faire du debugging à distance (validé avec jbuilder entreprise et eclipse), et de prendre en compte le certificat de l'autorité de confiance ac-racine du CRU:

!/bin/sh
JAVA_HOME=/usr/java/j2sdk1.4.2_03;export JAVA_HOME
# si debug : mettre MY_DEBUG a 1, et preciser le port avec JPDA_ADDRESS
MY_DEBUG=0
JPDA_ADDRESS=6665;export JPDA_ADDRESS
CATALINA_HOME=/home/cri/vmathieu/Tomcat;export CATALINA_HOME
CATALINA_BASE=$CATALINA_HOME;export CATALINA_BASE
CATALINA_OPTS="-Djavax.net.ssl.trustStore=/home/cri/vmathieu/uPortal/ca-racine.kestore";export CATALINA_OPTS
if [ "$MY_DEBUG" = "1" ]; then
  $CATALINA_HOME/bin/catalina.sh jpda start
else
$CATALINA_HOME/bin/catalina.sh start
fi

La prise en compte de l'autorité de confiance du CRU est utile pour l'authentification CAS.

Activer une log d'accès au niveau du serveur tomcat

Pas obligatoire, mais peut servir en cas de debug.

Dans le fichier server.xml, dans le context uportal ajouter :

 <Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="uportal.access.log." suffix=".txt"
pattern="common" resolveHosts="false"/>

Nettoyer les logs après les sessions de test

Le script stop.sh est modifié pour supprimer les logs :

#!/bin/sh
JAVA_HOME=/usr/java/j2sdk1.4.2_03;export JAVA_HOME
CATALINA_HOME=/home/cri/vmathieu/Tomcat;export CATALINA_HOME
CATALINA_BASE=$CATALINA_HOME;export CATALINA_BASE
$CATALINA_HOME/bin/shutdown.sh
echo "on vire les logs"
/bin/rm $CATALINA_BASE/logs/*

remarque : la log d'uportal va être redirigée vers ce répertoire logs après modifications

Logs

On va maintenant rediriger les logs d'uportal vers le répertoire de logs de tomcat.
On va voir également comment modifier le niveau des logs uportal à des fins de debugging.

On va travailler dans le répertoire des sources pour la modification du fichier de propriété de logs, puis déployer les modifs vers l'environnement d'exploitation.

On va pratiquer de la sorte dans les paragraphes suivants ,lors des modifications de fichier de configuration.

On édite le fichier uPortal/uPortal_rel-2-2/properties/Logger.properties, et on modifie la ligne suivante :

log4j.appender.R.File=Tomcat/logs/portal.log

(remarque : il serait préférable de mettre un chemin complet : ce fichier est interprêté par le moteur tomcat, mais aussi lors de différentes commandes ant (ex : ant initportal) qui ne sont pas exécutés depuis le même emplacement).

Si on a besoin d'avoir un niveau de logs plus élevé, on intervient sur la directive

log4j.rootCategory=INFO, R

On peut mettre d'autres valeurs, comme WARN, ERROR, DEBUG, ...

Et on augmente la taille du fichier log

log4j.appender.R.MaxFileSize=50000KB

On arrête tomcat, on déploie, on relance tomcat :

On contrôle que le fichier portal.log se trouve bient dans Tomcat/logs

Conseil : en cas de problème dans l'application des modifications suivantes, ne pas hésiter à regarder le log du portal, et éventuellement ceux de tomcat (en particulier, catalina.out).

Utilisation de mysql

L'objectif de ce paragraphe est de modifier l'environnement quick install pour utiliser un serveur mysql au lieu du hsql fourni.

On peut facilement extrapoler cette modification vers un autre SGBD supporté

Il est nécessaire de créer préalablement la base principale qui va servir de support au portail, et un utilisateur ayant tous les droits dans cette base.

On suppose ici que la base créée s'appelle uportalE, et que l'utilisateur ayant des droits dans cette base s'appelle uportalU, son mot de passe étant azerty.

Avant la manip, stop.sh et arrêt HSQL.

remarque : pour une installation 'standalone' sous windows, on peut utiliser une distribution "easy php" pour le support de mysql.

Coté uportal

Coté tomcat

modifier le fichier conf/serveur.xml pour que les pools de connexion jdbc/PortalDb et jdbc/PersonDb pointent vers la base créée :

ceci pour les deux pools de connexion.

Initialiser la base

ATTENTION : les directives suivantes réinitialisent la base uportal. toute donnée s'y trouvant préalablement est détruite.

Il est nécessaire au préalable de 'tricher' : faire 'croire' aux librairies uportal 'source' (non déployées) de le portail n'utilise pas les pools de connexion.

test réel

start d'uportal, et contrôle de fonctionnement

remarques

créer un compte local, ou changer un mot de passe

Si le compte login existe, ceci permet de changer le mot de passe ; sinon, ca créer le compte local correspondant.
ATTENTION : comme pour le ant db, il faut que les pools de connexion uportal soient désactivés dans l'environnement 'source'.

Francisation

A partir de la version 2.2, uportal supporte l'internationalisation.
La francisation est balbutiante. Les comptes par défaut sont naturellement en langage US.

Il faut d'abord faire comprendre à uportal que le francais existe, donc rajouter fr_FR à l'entrée org.jasig.portal.i18n.LocaleManager.portal_locales du fichier portal.properties.
(en fait, ça ne semble pas nécessaire ? je ne sais pas à quoi sert cette entrée).

Un utilisateur logué dans le portail peut changer la langue par défaut :
Preferences - Language - French. Le nom des langues supportées est francisé, c'est plutot bon signe; le francais existe donc un tout petit peu dans uportal.
Maintenant, on veut que le compte anonyme soit francais, et que les nouveau comptes créés aussi.

Par défaut, le compte anonyme correspond au compte interne Guest, et les nouveau utilisateurs héritent du profil du compte demo (paramétrable).

On va donc se loguer en compte demo et en compte guest pour activer la langue francaise (auparavant, il faut affecter un mot de passe au compte guest).

Voir le paragraphe 'installer la librairie cas-uportal' ; il y a un tout petit exemple de francisation d'une feuille xsl, ca peut donner des idées.

Problèmes

J'ai rencontré les problèmes suivants, à voir :

Authentification

L'authentification utilisée lors de l'installation quick-install utilise exclusivement la base uportal (en fait, le pool de connexion PersonDb).

Nous allons apporter les modifications nécessaires pour pouvoir authentifier CAS, LDAP ou base interne.

L'authentification LDAP n'est pas prévue dans esup-portail ; elle est expliquée ici à des fins didactiques.

Ajout de l'authentification LDAP

On intervient sur 2 fichiers : ldap.properties et security.properties

On va modifier dans l'environnement 'source', puis faire un 'ant deploy' pour réperciter les modifications vers l'environnement d'exploitation.

Ces fichiers sont donc dans uPortal/uPortal_rel-2-2/properties

ldap.properties

ldap.host=ldap.univ-nancy2.fr
ldap.port=392
ldap.baseDN=ou=People,dc=univ-nancy2,dc=fr
ldap.uidAttribute=uid

security.properties

doit contenir ceci :

root=org.jasig.portal.security.provider.UnionSecurityContextFactory
root.ldap=org.jasig.portal.security.provider.SimpleLdapSecurityContextFactory
root.simple=org.jasig.portal.security.provider.SimpleSecurityContextFactory
#root.cas=org.jasig.portal.security.provider.YaleCasContextFactory principalToken.root=userName
credentialToken.root=password
#credentialToken.root.cas=ticket #logoutRedirect.root.cas=https://auth.univ-nancy2.fr/logout?service=http://horus2.univ-nancy2.fr:8080/uPortal authorizationProvider=org.jasig.portal.security.provider.AuthorizationServiceFactoryImpl

On remarque 3 lignes en commentaire : elles concernent l'authentification CAS, a voir au paragraphe suivant

Comme auparavant, on arrête tomcat, on déploie, on relance tomcat

tests

On tente une authentification avec son login/password LDAP. Si OK, c'est bon. Sinon, voir la log du portail.
Le message de login est "Welcome Unrecognized person: VotreLogin". cela vient du fait que vous être authentifié, mais que le portail n'a pas pu recueillir d'informations relatifs à votre login (les attributs liés).
Vous pouvez vous en apercevoir en cliquant sur l'onglet 'développeur' : le canal "Person Attributes" n'expose aucun attribut lié à votre login.

Ajout de l'authentification CAS

Il va falloir :

On suppose, dans l'exemple, que le serveur CAS est accessible à
https://auth.univ-nancy2.fr/

On contrôle avant qu'on a bien cette ligne dans le start.sh :

CATALINA_OPTS="-Djavax.net.ssl.trustStore=/home/cri/vmathieu/uPortal/ca-racine.kestore";export CATALINA_OPTS

C'est un keystore qui contient le certificat de l'ac-racine du CRU. Il permet de valider des connexions https directes vers le serveur CAS (si celui-ci a bien un certificat délivré par le CRU, et envoie correctement la chaine de certification. A contrôler avec un navigateur W3).

Il y a de telles connexions https lors des mécanismes de récupération de Proxy Granting Ticket et de Proxy Tickets.

uportal accessible en https

uportal doit pouvoir être accessible en https, au moins depuis le serveur CAS vers l'URL de callback : c'est par une connexion sécurisée que le serveur CAS envoie le PGTiOU, qui sert à récupérer le PT.

Il doit donc disposer d'un couple clé privée / clé publique pour le serveur, et d'un certificat auto-validé ou validé par une autorité de certification.

Dans cet exemple, on dispose de certificats validés par l'ac-serveur du CRU, elle même validée par l'ac-racine du CRU.

On construit donc un keystore java qui inclu la clé privée et le certtificat de notre serveur, et les certificats des ac de la chaine de certification. Il est nommé ici horus2.keystore (voir les docs java_x509 et cas_x509)

Il faut donc modifier le fichier server.xml de tomcat :

- décommenter le bloc <Connector port="8443" ...
Ajouter avant la fin de ce bloc : keystoreFile="/Cert/horus2.keystore" keystorePass="xxxx" />

Adapter le nom du keystore et le mot de passe.

Tests : se connecter en https à uportal, (https://horus2.univ-nancy2.fr:8443/uPortal) puis cliquer sur le cadenas (en général, en bas à droite du navigateur) ; demander le détail du certificat ; on doit voir la chaine de certification.

Remarque : dans un environnement de développement, il est probable que l'on ne dispose pas de certificats du CRU.
Dans ce cas, il faut que le certificat soit connu du serveur CAS.

security.propertie

On décommente les 3 lignes précédentes en commentaire :

root.cas=org.jasig.portal.security.provider.YaleCasContextFactory principalToken.root=userName
credentialToken.root.cas=ticket
logoutRedirect.root.cas=https://auth.univ-nancy2.fr/logout?service=http://horus2.univ-nancy2.fr:8080/uPortal

Adapter la dernière à votre environnement ; c'est elle qui permet un logout CAS lors du logout uportal.

Installer la librairie cas-uPortal

On peut se référer à la documentation de cette opération pour plus de détails. La partie concernant le rendu change, pour tenir compte des spécificités de la V2.2

En fait, on intègre déja la librairie cas-client java (au jour de la rédaction, cas-client-2.0.10.tar.gz) :
cp -pr java/src/* uPortal/uPortal_rel-2-2/source/

Ensuite, la librairie cas-uPortal : cas2-uPortal.tar.gz

C'est la recopie de 2 fichiers java, plus l'ajout d'un lien sur la page d'accueil pour authentifier CAS, et la modification du logout pour forcer un logout CAS.

<a href="https://auth.univ-nancy2.fr/index.jsp?service=http://horus2.univ-nancy2.fr:8080/uPortal/Login">CAS NetID</a> 

Et pour le fun, on va franciser le message d'accueil (Welcome par défaut).

Modifier properties/portal.properties

Ajouter en fin de fichier les lignes suivantes :

org.jasig.portal.security.provider.YaleCasContext.CasValidateUrl=https://auth.univ-nancy2.fr/proxyValidate
org.jasig.portal.security.provider.YaleCasContext.CasProxyCallbackUrl=https://horus2.univ-nancy2.fr:8443/uPortal/CasProxyServlet
org.jasig.portal.security.provider.YaleCasContext.PortalServiceUrl=http://horus2.univ-nancy2.fr:8080/uPortal/Login

Modifier webpages/WEB-INF/web.xml

Ajouter les infos suivantes . ATTENTION, l'emplacement compte : "context-param" en tête de fichier, "servlet" avec les autres "servlet", "servlet-mapping" avec les autres "servlet-mapping".

  <context-param>
<param-name>edu.yale.its.tp.cas.proxyUrl</param-name>
<param-value>https://auth.univ-nancy2.fr/proxy</param-value>
</context-param> <servlet>
<servlet-name>CasProxyServlet</servlet-name>
<servlet-class>edu.yale.its.tp.cas.proxy.ProxyTicketReceptor</servlet-class>
<load-on-startup>4</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>CasProxyServlet</servlet-name>
<url-pattern>/CasProxyServlet</url-pattern>
</servlet-mapping>


Déployer et tester

./stop.sh, puis ant deploy, puis start.sh

Dans la page d'accueil, on doit voir le lien permettant d'être redirigé vers le serveur CAS (et, si le compte guest a activé la langue française, le message "Welcome Guest" est changé en "Bienvenue invite").

Se loguer dans le portail via le serveur CAS. On doir voir "Welcome vmathieu" (ou "Bienvenue vmathieu).

Ce controle n'est pas suffisant : il faut contrôler qu'uportal est capable de récupérer le PGP (Proxy Granting Ticket), et donc d'être proxy CAS.

Pour celà :

- Mettre les logs en mode DEBUG
- Se loguer dans le portail via CAS
- grep -i pgt logs/portal.log : on devrait avoir un message du style :

    <cas:proxyGrantingTicket>PGTIOU-23745-N0HL...SbH7e</cas:proxyGrantingTicket>

- Si la log d'accès est activée au niveau serveur tomcat, faire
grep -i pgt logs/uportal.access.log.2004-02-02.txt (adapter le nom du fichier log)
et on devrait avoir qq chose comme :

GET /uPortal/CasProxyServlet?pgtIou=PGTIOU-23745-N0HL...SbH7e&pgtId=PGT-44390-J4i3...mgbGO HTTP/1.1" 200 78

Si vous avez ce message, vous êtes sûr que tout est bon.

Attributs LDAP

Maintenant, on va faire en sorte qu'uportal interroge LDAP pour récupérer les attributs de personne (en plus de sa base locale.

Pour celà, on va éditer le fichier uPortal/uPortal_rel-2-2/properties/PersonDirs.xml

Ce fichier permet de déclarer plusieurs sources de données qui vont être utilisés lors du login de l'utilisateur pour enrichir ses 'attributs uportal'.
Pour chaque source de données, on va faire un 'mapping' entre un nom d'attribut uportal et un champ SQL ou un attribut LDAP.
Chaque source données est explorée lors du login. Les attributs liés à un utilisateur peuvent donc être extraits simultanément de différents source.
Les sources de type base de données peuvent provenir de pools gérés par tomcat, ou de connexions directes à la base.

Dans le PersonDirs.xml :

il y a un bloc <PersonDirInfo> par source de données ; il contient la déclaration de la source de données ; il contient également un bloc <attributes> composé de n blocs <attributes> qui font le mapping recherché.
ex :

<PersonDirs>
  <PersonDirInfo> <!-- recuperations d'infos de LDAP -->
    <url>ldap://ldap1.univ-nancy2.fr:392/dc=univ-nancy2,dc=fr ldap://ldap2.univ-nancy2.fr:392/dc=univ-nancy2,dc=fr</url>
    <logonid></logonid>
    <logonpassword></logonpassword>
    <uidquery>(uid={0})</uidquery>
<usercontext></usercontext> <attributes> <attribute>
<name>cn</name> <alias>cn</alias> </attribute> <attribute> <name>cn</name>
<alias>displayName</alias> </attribute> <attribute>
<name>mail</name>
<alias>mail</alias>
</attribute> <!-- ........ --> </attributes> </PersonDirInfo> <PersonDirInfo> <!-- recuperation depuis un pool de connexion tomcat --> <res-ref-name>PersonDb</res-ref-name> <uidquery>SELECT FIRST_NAME||' '||LAST_NAME AS FIRST_LAST, FIRST_NAME, LAST_NAME, EMAIL FROM UP_PERSON_DIR WHERE USER_NAME=?</uidquery>
<attributes> <attribute>
<name>FIRST_NAME</name>
<alias>displayName</alias>
</attribute> </attributes> <attribute>
<name>EMAIL</name>
<alias>mail</alias>
</attribute> <!-- ........ --> </attributes> </PersonDirInfo> </PersonDirs>

pourquoi on ne voyait plus les attributs des comptes locaux après avoir passé en mysql ? Tout simplement parce que le PersonDirs.xml initial utilise une connexion directe à la base uportal au lieu de pool PersonDb :

<driver>org.hsqldb.jdbcDriver</driver>
<url>jdbc:hsqldb:hsql://localhost:8887</url>
<logonid>sa</logonid>
<logonpassword></logonpassword>
<uidquery>SELECT FIRST_NAME||' '||LAST_NAME AS FIRST_LAST, FIRST_NAME, LAST_NAME, EMAIL FROM UP_PERSON_DIR WHERE USER_NAME=?</uidquery>

Et donc, uportal tente d'accéder à hsql au lieu de mysql !

Après édition du personDirs.xml, ./stop.sh - ant deploy ./start.sh

Test :

accèder au portal avec votre login (CAS ou LDAP). Vous avez le message "Welcome Vincent".
Cliquez sur l'onglet 'Developer', et vous verrez dans le canal 'Person Attributes' les attributs que vous aurez déclarés.

Groupes LDAP

On va maintenant créer dans uportal des groupes issus de requêtes LDAP.

Le paramétrage global se fait à l'aide du fichier properties/groups/compositeGroupServices.xml. Grace à ce fichier, il est possible de brancher différents 'gestionnaires' de groupes.

Des docs sur le site uportal expliquent le paramétrage du gestionnaire de groupes :

En standard sont livrés dans la distribution uportal les gestionnaires suivants :

Il est possible de déclarer un ou plusieurs gestionnaires de groupes dans uportal ; ceux-ci sont déclarés dans le fichier properties/groups/compositeGroupServices.xml (un peu à la manière du security.properties, en indiquant le nom de classes java chargées de gérer ce gestionnaire de groupes, ce qui offre une grande souplesse).

Fichier compositeGroupServices.xml

Pour utiliser LDAPGroupStore, il suffit de décommenter dans le fichier compositeGroupServices.xml les lignes concernant le "LDAP group service component" :

  <service>
<name>ldap</name>
<service_factory>org.jasig.portal.groups.ReferenceIndividualGroupServiceFactory</service_factory>
<entity_store_factory>org.jasig.portal.groups.ldap.LDAPEntityStoreFactory</entity_store_factory>
<group_store_factory>org.jasig.portal.groups.ldap.LDAPGroupStoreFactory</group_store_factory>
<entity_searcher_factory>org.jasig.portal.groups.ldap.LDAPEntitySearcherFactory</entity_searcher_factory <internally_managed>false</internally_managed>
<caching_enabled>false</caching_enabled>
</service>

Ce service LDAP fonctionne comme celà :

fichier properties/groups/LDAPGroupStoreConfig.xm

Ensuite, on va paramétrer ce service LDAP dans le fichier properties/groups/LDAPGroupStoreConfig.xml

En voici un exemple :

<LDAPGroupStore>
<config>
<url>ldap://ldap1.univ-nancy2.fr:392/dc=univ-nancy2,dc=fr ldap://ldap2.univ-nancy2.fr:392/dc=univ-nancy2,dc=fr</url> <logonid></logonid>
<logonpassword></logonpassword>
<keyfield>uid</keyfield>
<namefield>cn</namefield>
<usercontext></usercontext>
<refresh-minutes>1440</refresh-minutes>
</config>
<group name="Groupes LDAP" key="allldap"> <description>Tout les groupes LDAP</description> <group name="Pers" key="allpers"> <description>Personnel de Nancy 2</description> <group name="CRI" key="cri"> <description>Centre de REssources Informatiques</description> <entity-set> <filter string="(&amp;(objectclass=N2CLassPersonnel)(|(N2AtrPersCompCode=CRI)(N2AtrPersCompBis=CRI)))"/ </entity-set> </group> </group> <group name="Etudiants" key="alletud"> <description>Etudiant de Nancy 2</description> <group name="PLG" key="PLG"> <description>Pole Lorrain de Gestion</description> <group name="mmiage1" key="mmiage1"> <description>IUP MIAGE 1A</description> <entity-set> <filter string="(&amp;(objectclass=N2ClassEtudiant)(n2AtrTypePeople=APO_*)(n2atrGroupe=mmiage1))" /> </entity-set> </group> </group> </group> </group> </LDAPGroupStore>

Utilisation dans le portail

Vous pouvez maintenant consulter le contenu de ces groupes