CAS e single sign out

cancel
Showing results for 
Search instead for 
Did you mean: 
otakar81
Member II

CAS e single sign out

Salve.

Come scritto nell'altro topic, ho integrato più o meno correttamente alfresco, liferay. ldap e cas.

Uno dei problemi al momento insoluti è il seguente.

Liferay ha a tutti gli effetti il ruolo di "portale", con alfresco ed altre applicazioni che funzionano "al suo interno" attraverso iframe.
Di conseguenza tutta la gestione utenze (al di là di quella, specifica, delle altre applicazioni), la login e la logout sono gestite da liferay.

Ora, quando faccio logout da liferay, il sistema svuota la sessione di liferay, e svuota quella del cas.
Il problema è che le sessioni degli altri applicativi (tra cui alfresco) rimangono a tutti gli effetti in piedi, a meno che io non chiudano le finestre del browser (cosa, in effetti, consigliata anche dagli stessi autori del cas, per ragioni di sicurezza).

Il che significa che se mi loggo via CAS con l'utente "admin", faccio logout e poi rientro (senza chiudere il browser) con l'utente "pippo"… liferay mi vede correttamente come "pippo", ma alfresco continua a vedermi come "admin", perchè trova un'utenza già presente e correttamente loggata nella sua sessione.

Se la cosa si potesse risolvere attraverso un'opportuna configurazione sarebbe ovviamente la soluzione più pulita ed ideale… altrimenti potrebbe essermi utile sapere dove alfresco fa effettivamente il controllo sulla presenza o meno dell'utenza (immagino qualcosa del tipo: se c'è un utente loggato vai avanti, altrimenti verifica se c'è qualcuno nella sessione del cas) per poter intervenire lì e "manometterla".

Vi ringrazio molto
7 Replies
openpj
Moderator
Moderator

Re: CAS e single sign out

Ciao otakar,

per poter integrare correttamente Alfresco con qualsiasi portlet container è necessario integrare Alfresco utilizzando correttamente gli authenticator per il Single Sign On (SSO).
Nel tuo caso, se hai integrato Alfresco con delle IFramePortlet, non si può considerare un'integrazione vera, ma solo un workaround.
Ed in effetti facendo in questo modo, si hanno solo problemi di sincronizzazione della sessione tra il portale e le web application che richiedono questa sincronizzazione.

Alfresco supporta CAS e quindi è necessario configurare opportunamente Alfresco con il tuo sistema CAS esattamente come hai fatto per LifeRay, di seguito ti lascio il riferimento ufficiale della wiki:
http://wiki.alfresco.com/wiki/Central_Authentication_Service_Configuration

Se invece hai necessità di integrare Alfresco solo con LDAP puoi seguire le istruzioni nella wiki:
http://wiki.alfresco.com/wiki/Enterprise_Security_and_Authentication_Configuration

Inoltre per poter svolgere una vera integrazione con un portlet container puoi utilizzare la classe fornita da Alfresco, WebScriptPortlet, che ti consente di esporre qualsiasi Alfresco WebScript come una standard portlet.

http://wiki.alfresco.com/wiki/3.0_Web_Scripts_Framework#JSR-168_Runtime

Oppure puoi implementare una standard portlet e comunicare con il repository con una delle API esposte da Alfresco (CMIS, WebScript, Web Services, JCR, REST).

Ti consiglio spassionatamente di non utilizzare la IFramePortlet, anche perché è impossibile passare la sessione utente all'interno, a meno che tu non voglia esporre in chiaro le password, ma non credo tu voglia farlo  Smiley Wink

Spero ti possa aiutare.
otakar81
Member II

Re: CAS e single sign out

Ti ringrazio Smiley Happy

Si, in effetti si tratta di una soluzione "rapida", ma certamente non ottimale.
Purtroppo ci hanno affidato questo progetto da un momento all'altro, con la scadenza dietro l'angolo… quindi ci si è dovuti purtroppo arrangiare nella maniera più "indolore" possibile…

Anche perchè in ogni caso non era nelle nostre esigenze quella di far parlare davvero alfresco con liferay… l'importante era che ci fosse una condivisione di utenze (realizzata centralizzandole in LDAP).

Ho tentato varie soluzioni "alla buona" per risolvere il problema riscontrato nel logout, ma senza successo…

Fortunatamente ora, realizzata la consegna "di facciata", ho un po' più di tempo per fare le cose per bene… e stavo provando a far funzionare in liferay la portlet alfresco client: in questo modo le due applicazioni dovrebbero a tutti gli effetti condividere la sessione, e presumo quindi che un eventuale logout da liferay comporti un logout anche da alfresco.

Tuttavia, mentre sotto tomcat liferay+alfresco sta funzionando, ho qualche problema a far andare la portlet di alfresco con jboss (che è l'application server che stiamo usando)… sembra ci sia un conflitto con myfaces, a giudicare da questo errore:

10:21:30,142 WARN  [JBossJSFConfigureListener] MyFaces JSF implementation found!  This version of JBoss AS ships with the java.net implementation of JSF.  There are known issues when mixing JSF implementations.  This warning does not apply to MyFaces component libraries such as Tomahawk.  However, myfaces-impl.jar and myfaces-api.jar should not be used without disabling the built-in JSF implementation.  See the JBoss wiki for more details.

10:21:30,439 ERROR [[/alfresco]] Exception sending context initialized event to listener instance of class org.jboss.web.jsf.integration.config.JBossJSFConfigureListener
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! Path WEB-INF/faces-config-custom.xml does not start with a "/" character

Sto approfondendo la cosa…
openpj
Moderator
Moderator

Re: CAS e single sign out

Quello non è un problema di portlet, il warning per l'implementazione MyFaces viene fuori cmq, ma è solo un warning.
L'altra eccezione riguarda un altro problema.

Per poter deployare Alfresco all'interno di un portlet container come LifeRay o JBoss Portal tipicamente è meglio eliminare la libreria portlet-api-lib.jar all'interno di WEB-INF/lib di Alfresco.
Altrimenti potresti avere grossi problemi per esporre le portlet nel portlet-container, in quanto ci sarebbe sempre un classCastException dovuta alla presenza multipla delle API delle portlet.
otakar81
Member II

Re: CAS e single sign out

Scusami, sono stato poco preciso.

Ho fatto il deploy all'interno di liferay del file "alfresco-portlet-5.2.0.1.war" preso dal repository di liferay, ed al suo interno probabilmente hanno già eliminato la libreria che citi, visto che non è presente.

D'altra parte usando come application server tomcat tutto funziona correttamente… quindi più che un problema "alfresco-liferay" sembrerebbe essere un problema "alfresco-jboss".

Ti mostro l'eccezione che mi mostra… forse a te salta subito all'occhio quale sia il problema  Smiley Very Happy

Prima eccezione:

13:52:58,175 WARN  [JBossJSFConfigureListener] MyFaces JSF implementation found!  This version of JBoss AS ships with the java.net implementation of JSF.  There are known issues when mixing JSF implementations.  This warning does not apply to MyFaces component libraries such as Tomahawk.  However, myfaces-impl.jar and myfaces-api.jar should not be used without disabling the built-in JSF implementation.  See the JBoss wiki for more details.
13:52:58,519 ERROR [[/alfresco]] Exception sending context initialized event to listener instance of class org.jboss.web.jsf.integration.config.JBossJSFConfigureListener
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! Path WEB-INF/faces-config-custom.xml does not start with a "/" character
   at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:212)
   at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:195)
   at org.jboss.web.jsf.integration.config.JBossJSFConfigureListener.contextInitialized(JBossJSFConfigureListener.java:71)
   at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3856)
   at org.apache.catalina.core.StandardContext.start(StandardContext.java:4361)
   at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:790)
   at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:770)
   at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:553)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:296)
   at org.jboss.mx.server.RawDynamicInvoker.invoke(RawDynamicInvoker.java:164)
   at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
   at org.apache.catalina.core.StandardContext.init(StandardContext.java:5312)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:296)
   at org.jboss.mx.server.RawDynamicInvoker.invoke(RawDynamicInvoker.java:164)
   at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
   at org.jboss.web.tomcat.service.TomcatDeployer.performDeployInternal(TomcatDeployer.java:301)
   at org.jboss.web.tomcat.service.TomcatDeployer.performDeploy(TomcatDeployer.java:104)
   at org.jboss.web.AbstractWebDeployer.start(AbstractWebDeployer.java:375)
   at org.jboss.web.WebModule.startModule(WebModule.java:83)
   at org.jboss.web.WebModule.startService(WebModule.java:61)
   at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)
   at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)
   at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
   at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
   at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
   at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
   at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)
   at $Proxy0.start(Unknown Source)
   at org.jboss.system.ServiceController.start(ServiceController.java:417)
   at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
   at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
   at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
   at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
   at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
   at $Proxy44.start(Unknown Source)
   at org.jboss.web.AbstractWebContainer.start(AbstractWebContainer.java:466)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
   at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
   at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
   at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
   at org.jboss.mx.interceptor.DynamicInterceptor.invoke(DynamicInterceptor.java:97)
   at org.jboss.system.InterceptorServiceMBeanSupport.invokeNext(InterceptorServiceMBeanSupport.java:238)
   at org.jboss.wsf.container.jboss42.DeployerInterceptor.start(DeployerInterceptor.java:87)
   at org.jboss.deployment.SubDeployerInterceptorSupport$XMBeanInterceptor.start(SubDeployerInterceptorSupport.java:188)
   at org.jboss.deployment.SubDeployerInterceptor.invoke(SubDeployerInterceptor.java:95)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
   at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
   at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
   at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
   at $Proxy45.start(Unknown Source)
   at org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025)
   at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819)
   at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)
   at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
   at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
   at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
   at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
   at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
   at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
   at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
   at $Proxy9.deploy(Unknown Source)
   at org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:421)
   at org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:634)
   at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.doScan(AbstractDeploymentScanner.java:263)
   at org.jboss.deployment.scanner.AbstractDeploymentScanner.startService(AbstractDeploymentScanner.java:336)
   at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)
   at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)
   at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
   at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
   at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
   at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
   at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)
   at $Proxy0.start(Unknown Source)
   at org.jboss.system.ServiceController.start(ServiceController.java:417)
   at sun.reflect.GeneratedMethodAccessor8.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
   at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
   at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
   at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
   at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
   at $Proxy4.start(Unknown Source)
   at org.jboss.deployment.SARDeployer.start(SARDeployer.java:304)
   at org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025)
   at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819)
   at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)
   at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:766)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
   at java.lang.reflect.Method.invoke(Method.java:597)
   at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
   at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
   at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
   at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
   at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
   at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
   at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
   at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
   at $Proxy5.deploy(Unknown Source)
   at org.jboss.system.server.ServerImpl.doStart(ServerImpl.java:482)
   at org.jboss.system.server.ServerImpl.start(ServerImpl.java:362)
   at org.jboss.Main.boot(Main.java:200)
   at org.jboss.Main$1.run(Main.java:508)
   at java.lang.Thread.run(Thread.java:619)
Caused by: java.net.MalformedURLException: Path WEB-INF/faces-config-custom.xml does not start with a "/" character
   at org.apache.catalina.core.ApplicationContext.getResource(ApplicationContext.java:457)
   at org.apache.catalina.core.ApplicationContextFacade.getResource(ApplicationContextFacade.java:176)
   at com.sun.faces.config.configprovider.WebResourceProvider.getContextURLForPath(WebResourceProvider.java:114)
   at com.sun.faces.config.configprovider.WebResourceProvider.getResources(WebResourceProvider.java:84)
   at com.sun.faces.config.ConfigManager$URLTask.call(ConfigManager.java:547)
   at com.sun.faces.config.ConfigManager$URLTask.call(ConfigManager.java:516)
   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
   at java.util.concurrent.FutureTask.run(FutureTask.java:138)
   at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
   … 1 more


Ed intanto continuo a cercare….  grazie ancora  Smiley Happy
openpj
Moderator
Moderator

Re: CAS e single sign out

Ok probabilmente potrebbe dipendere dal fatto che JBoss internamente contiene le librerie di implementazione delle JSF che vanno in conflitto con quelle di LifeRay.

Sei sicuro di aver configurato correttamente LifeRay con JBoss?
otakar81
Member II

Re: CAS e single sign out

Beh, credo di si… anche perchè ho usato la bundle con jboss presa direttamente dal sito di liferay… quindi presumo che sia configurata correttamente.

Jboss usa a quanto ho visto questre 3 librerie:

jboss-faces.jar
jsf-api.jar
jsf-impl.jar

Ma non le posso toccare.
Da un'altra parte consigliavano di cancellare o queste o quelle di alfresco, ma se elimino quelle di jboss non parte più nulla, mentre se cancello quelle di alfresco ho all'avvio un errore di ClassNotFoundException…

Vedo se riesco a trovare qualcos'altro…
otakar81
Member II

Re: CAS e single sign out

Ok, risolto: era effettivamente un conflitto di librerie.

Segnalo questo utile link:

http://www.jboss.org/community/wiki/Running26WithJBossAS42xAndMyFaces

Grazie  Smiley Very Happy