Bon pour relecture
Introduction :
Pour un déploiement portlet, la stratégie employée est la suivante : le portail (uPortal) passe à la portlet un PT, à partir duquel la portlet pourra récupérer le PGT convoité. Cela implique des modifications dans uPortal, légères.
Nous montrerons tout d'abord les modifications à effectuer dans uPortal pour qu'un PT soit passé aux portlets via une préférence JSR-168.
Nous montrerons enfin comment, dans esup-commons, on récupère un PT que l'on pourra ensuite passer à des services pour authentifier l'utilisateur connecté.
Sommaire :
Passage du PT du portail vers une portlet
Nouvel adaptateur pour les portlets : CCasProxyPortletAdapter
Récupérer ou écrire la classe org.esupportail.portal.channels.portlet.CCasProxyPortletAdapter, qui hérite de CPortletAdapter en surchargeant sa méthode getUserInfo(). Cette méthode est appelée une fois à l'initialisation du canal pour remplir une table des paramètres passés à la portlet via le mécanisme de préférences de JSR-168. On y ajoute simplement ajoute un paramètre qui contient le PT.
Le nom du paramètre et l'URL pour lequel le PT est récupéré sont passés en paramètre à la publication de la portlet dans uPortal (cf ci-dessous). Ces deux paramètres sont :
- casProxyTicketPref, optionnel, par défaut casProxyTicket.
- casTargetService, obligatoire
Nouveau type de canal : CasProxyPortlet
On pourrait publier les portlets proxy CAS de type Custom en utilisant l'adaptateur ci-dessus, mais il semble plus indiqué de créer un nouveau type de canal dédié pour l'occasion. Pour cela, on crée donc un nouveau type de canal dans la base uPortal, de nom CasProxyPortlet, qui utilise la classe org.esupportail.portal.channels.CCasProxyPortletAdapter (au lieu de org.jasig.portal.channels.CPortletAdapter pour le type Portlet).
Dans une version ultérieure de uPortal-esup, on pourra ajouter les lignes suivantes à <uportal>/properties/db/esup-data.xml pour la table UP_CHAN_TYPE :
<row>
<column><name>TYPE_ID</name>
<value>12</value></column>
<column>
<name>TYPE</name>
<value>org.esupportail.portal.channels.portlet.CCasProxyPortletAdapter</value>
</column>
<column>
<name>TYPE_NAME</name><value>CasProxyPortlet</value>
</column>
<column>
<name>TYPE_DESCR</name>
<value>Adapter for CAS proxy JSR-168 Portlets</value>
</column>
<column>
<name>TYPE_DEF_URI</name>
<value>/org/esupportail/portal/channels/portlet/CCasProxyPortletAdapter.cpd</value>
</column>
</row>
Récupérer CCasProxyPortletAdapter.cpd.
Publication de la portlet
Il faut publier la portlet en utilisant le nouvel adaptateur, on utilisera par exemple le fichier de configuration XML suivant :
<channel-definition>
...
<type>CasProxyPortlet</type>
<class>org.esupportail.portal.channels.channels.portlet.CCasProxyPortletAdapter</class>
...
<parameters>
<parameter>
<name>portletDefinitionId</name>
<value>esup-blank.esup-blank</value>
<ovrd>N</ovrd>
</parameter>
<parameter>
<name>casProxyTicketPref</name>
<value>casProxyTicket</value>
<description>The name of the JSR-168 preference used to pass the proxy ticket</description>
<ovrd>N</ovrd>
</parameter>
<parameter>
<name>casTargetService</name>
<value>http://portal.domain.edu/application</value>
<description>The CAS service of the portlet</description>
<ovrd>N</ovrd>
</parameter>
</parameters>
</channel-definition>
C'est tout ce qu'il faut faire au niveau de uPortal. Une fois ces modifications faites, la portlet dispose d'une préférence supplémentaire (casProxyTicket par défaut), qui contient un PT pour l'utilisateur courant.
Le paramètre casTargetService indique à uPortal pour quel service récupérer le PT à passer. Il ne s'agit pas d'une URL réelle, mais cette même URL doit être précisée à l'initialisation du bean casService (propriété service, voir plus loin) qui sert à récupérer de nouveaux PTs pour les services accédés par l'application.
L'adaptateur CCasProxyPortletAdapter peut également être utilisé pour publier des portlets qui n'ont pas besoin de ticket CAS ; il suffit dans ce cas de ne pas spécifier de paramètre casTargetService à la publication de la portlet.
Récupération du PT transmis par le portail à la portlet
Le PT transmis par le portail est récupéré par le bean casService, défini par exemple dans le fichier de configuration Spring /properties/auth/auth.xml :
<bean
id="casService"
class="org.esupportail.commons.services.cas.PortletCasServiceImpl" >
<property
name="service"
value="http://portal.domain.edu/application" />
<property
name="casValidateUrl"
value="https://cas.domain.edu/proxyValidate" />
<property
name="proxyCallbackUrl"
value="https://portal.domain.edu/application/casProxyCallback" />
</bean>
Les propriétés service, casValidateUrl et proxyCallbackUrl du bean casService ont les significations suivantes :
- La propriété service indique pour quel service récupérer des PTs. Cette propriété n'est pas une URL réelle, mais elle doit strictement correspondre au paramètre casTargetService utilisé lors de la publication de la portlet.
- La propriété casValidateUrl est l'URL du serveur CAS utilisée pour valider le PT transmis par le portail à la portlet.
- La propriété proxyCallbackUrl est l'URL utilisée par le serveur CAS pour communiquer à la portlet le PGT.
C'est le bean casService qui récupère le PT transmis par le portail, à travers les préférences JSR-168. Par défaut, il s'attend à trouver le PT dans la préférence nommée casProxyTicket ; il est possible d'utiliser une autre préférence, dont on spécifie alors le nom à travers la propriété casProxyTicketPref du bean casService.Configuration de la callback du PGT
Pour que le PGT soit récupéré par l'application, il faut que l'application soit à l'écoute sur une URL de callback, celle donnée à la propriété proxyCallbackUrl du bean casService. Pour cela, il faut configurer une servlet supplémentaire dans le contexte Tomcat de l'application, dans le fichier /properties/WEB-INF/web.xml :
<servlet> <servlet-name>CasProxyCallback</servlet-name> <servlet-class>edu.yale.its.tp.cas.proxy.ProxyTicketReceptor</servlet-class> <init-param> <param-name>edu.yale.its.tp.cas.proxyUrl</param-name> <param-value>https://cas.domain.edu/proxy</param-value> </init-param> <load-on-startup>4</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CasProxyCallback</servlet-name> <url-pattern>/casProxyCallback</url-pattern> </servlet-mapping>