Combination View Flat View Tree View
Threads [ Previous | Next ]
toggle
Bernardo Riveira Faraldo
land URL when login - Liferay(+CAS) not like other webapps
May 5, 2009 3:37 AM
Answer

Bernardo Riveira Faraldo

Rank: Regular Member

Posts: 136

Join Date: October 30, 2008

Recent Posts

let me explain our problem; with any other (well designed) userpassword-protected webapp we work with, there are 2 possible things to do when the user gets into the portal:

1) if the user enters the portal without a specific URI, just using "http://myportal.com", then it should go to a default web page; this is what we want and we have made it touching portal-ext.properties with

auth.forward.by.last.path=true
default.landing.page.path=/liferay/group/blablah

so, when an user enters the portal with "myportal.com", he is being redirected to "myportal.com/liferay/group/blablah".


2) when the user enters the portal with a complete URI like

http://myportal.com/liferay/group/ANOTHERGROUP

then, he should see that page he requested

OK, where's the problem? We use CAS-JASIG, the complete liferay portal is protected (this being an intranet site), so this is what happens:

1) if the user enters the portal without a specific URI, just using "http://myportal.com", he has to enter (in a CAS form) his username and password and then he's being redirected to "myportal.com/liferay/group/blablah" (the "default.landing.page.path")

2) if the user enters the portal with a complete URI like "http://myportal.com/liferay/group/ANOTHERGROUP", then he has to enter (in a CAS form) his username and password and then he's being redirected to "myportal.com/liferay/group/blablah" (the "default.landing.page.path"), so he does not hit what he wanted in the first time ("http://myportal.com/liferay/group/ANOTHERGROUP")

Don't know if this also happens in non-CAS installations, but, is there any way to solve it? If not, it is broken, as if for example you use emails with links to specific URLs of the portal they will not work, as the user is always redirected to the default landing page.

I know that there is a way to redefine (with java) this first page scenario, but I'm afraid it is not only Liferays fault but the CAS adaptor.

Thanks in advance
Bernardo


### EDITED: ok, if this is not the first time they go to the intranet, then they are redirected to the LAST PAGE they visited, which is NOT very web-like (I mean, it is a strange behaviour to web users, where the URL is "god" and you should always see what you asked for), that is because of "auth.forward.by.last.path=true", but we have to enter that so "default.landing.page.path" works (althought I don't know why, as they should not be related)
Bernardo Riveira Faraldo
RE: land URL when login - Liferay(+CAS) not like other webapps
May 14, 2009 2:44 AM
Answer

Bernardo Riveira Faraldo

Rank: Regular Member

Posts: 136

Join Date: October 30, 2008

Recent Posts

as nobody threw any light on this (in my opinion) serius misdesign of liferay, at least the flexibility the customizacion of Actions has allowed us to solve it...

we have implemented a LoginPreAction that sees a "redirect" parameter; that parameter is the URL the user first wanted to see, so we just put that value into the HTTP Session (using a servlet session attribute)

then in a new DefaultLandingPageAction class we check wether we have that session value and use it as "last path" so the user goes to where she wanted to go in the first time!

also, we added code to that new DefaultLandingPageAction class to check the organizations the user belongs to, so in effect we have now multiple default landing paths, (portal-ext.properties only allows for one path to be specified and we wanted to move the users to the private pages of the organization they belong to)

as with every other thing in liferay, this is not specially difficult, once you know how it works!!!
Jamie L Sammons
RE: land URL when login - Liferay(+CAS) not like other webapps
May 15, 2009 8:58 AM
Answer

Jamie L Sammons

Rank: Junior Member

Posts: 33

Join Date: November 18, 2008

Recent Posts

I don't suppose you could share the code for that? I am having the same issue with CAS and Liferay.
Bernardo Riveira Faraldo
RE: land URL when login - Liferay(+CAS) not like other webapps
May 19, 2009 4:37 AM
Answer

Bernardo Riveira Faraldo

Rank: Regular Member

Posts: 136

Join Date: October 30, 2008

Recent Posts

OF COURSE, there it goes... without warranty of any kind emoticon (to use opensource code like liferay and not showing up our code is not only illegal, but uneducated emoticon this is code copied and pasted from opensourced classes, so I suppose in compliance with the license it should be algo opensourced... emoticon

please don't use this as it comes, as THIS IS what we need, but maybe not what you need!

in the loginpreaction we save the "redirect" parameter in the session (if present)

 1
 2package com.mundor.la3.liferay;
 3
 4import com.liferay.portal.kernel.events.Action;                            
 5                                                                                                                                       
 6import javax.servlet.http.HttpServletRequest;                        
 7import javax.servlet.http.HttpServletResponse;                      
 8                                                                     
 9public class La3LoginPreAction extends Action {                  
10                                                                     
11    public void run(HttpServletRequest req, HttpServletResponse res) {                                    
12
13        // nos pillamos el parámetro redirect, es donde quería ir el cliente inicialmente
14        String redirect = req.getParameter("redirect");
15        if (redirect!=null && !("".equals(redirect))) {
16            // lo metemos en la sesión para usarlo en La3DefaultLandingPageAction
17            req.getSession().setAttribute("LA3_REDIRECT", redirect);
18        }
19    } 
20}


then in the new DefaultLandingPageAction we use that value; the code I put below here is somewhat more "convoluted" as it makes another change we needed... this is the pseudocode:

- if the user entered a full URL (we now because of the LA3_REDIRECT value we saved in the session) then she goes there!

- else, we look at their organizations; (we have more than one); our private organization pages should work as homepages for their users, and there is a "main" organization, so if a user belongs to more than one org, he should go there as first option, (that's why we check if the user organization first page is the same as the global DefaultLandingPage value; if true, the first page the user sees is that one; else, she is redirected to one of the organizations she is member of (we just get the last one)

- else, (should never happen) she goes to the lastpath as configured

  1
  2package com.mundor.la3.liferay;
  3
  4/**
  5 * Personalización para llegar hasta las organizaciones de un usuario
  6 */
  7
  8import com.liferay.portal.kernel.events.Action;
  9import com.liferay.portal.kernel.util.StringPool;
 10import com.liferay.portal.kernel.util.Validator;
 11import com.liferay.portal.model.Organization;
 12import com.liferay.portal.model.User;
 13import com.liferay.portal.struts.LastPath;
 14import com.liferay.portal.util.PortalUtil;
 15import com.liferay.portal.util.PropsKeys;
 16import com.liferay.portal.util.PropsValues;
 17import com.liferay.portal.util.WebKeys;
 18
 19import java.util.Enumeration;
 20import java.util.HashMap;
 21import java.util.List;
 22
 23import javax.servlet.http.HttpServletRequest;
 24import javax.servlet.http.HttpServletResponse;
 25import javax.servlet.http.HttpSession;
 26
 27import org.apache.commons.logging.Log;
 28import org.apache.commons.logging.LogFactory;
 29
 30
 31public class La3DefaultLandingPageAction extends Action {
 32
 33    public void run(HttpServletRequest request, HttpServletResponse response) {
 34       
 35        //_mostrar_datos_peticion(request);       
 36       
 37        HttpSession session = request.getSession();
 38       
 39        // esta es la DefaultLandingPage de portal-ext.properties:
 40        String pathDefaultLandingPage = PropsValues.DEFAULT_LANDING_PAGE_PATH;
 41       
 42        // primero vemos si no llegamos aqui con una URL a la que ir
 43       
 44        String redirect=(String)session.getAttribute("LA3_REDIRECT");
 45       
 46        if (redirect!=null && !("".equals(redirect))) {
 47            
 48            // el usuario llega a la3 con una URL completa, por lo que debemos
 49            // ir a esa..
 50            LastPath lastPath = new LastPath(
 51                    StringPool.BLANK, redirect, new HashMap<String, String[]>()) ;          
 52            session.setAttribute(WebKeys.LAST_PATH, lastPath);
 53            _log.info("redireccion detectada en La3LoginPreAction - " + redirect + " modificamos lastPath");
 54            
 55        } else {
 56
 57            // localizamos organizaciones a las que pertenece el usuario
 58            
 59            try {
 60                User usr = PortalUtil.getUser(request);
 61                List<Organization> orgs = usr.getOrganizations();
 62                boolean usarPathDefecto = false;
 63                String ultimoPath = null;
 64                
 65                for (Organization org : orgs) {
 66                    ultimoPath = "/liferay/group" + org.getGroup().getFriendlyURL();                   
 67                    _log.info("usuario pertenece a organizacion '"  + org.getName() + "' con URL privada " + ultimoPath);
 68                    if (pathDefaultLandingPage.startsWith(ultimoPath)) {
 69                        // el usuario pertenece a la org. principal,
 70                        // así que nos salimos ya y que vaya a esa
 71                        usarPathDefecto = true;
 72                        _log.info("es la misma organizacion de la URL de DefaultLandingPage");
 73                    }
 74                }
 75               
 76                // ahora, si no encontró la organización por defecto y tenemos al menos otra
 77                // vamos a esa otra (nos quedamos realmente con la última del bucle
 78               
 79                if (!usarPathDefecto && ultimoPath!=null) {
 80                    //vamos a esa...
 81                    LastPath lastPath = new LastPath(
 82                            StringPool.BLANK, ultimoPath, new HashMap<String, String[]>());                        
 83                    session.setAttribute(WebKeys.LAST_PATH, lastPath);
 84                    _log.info("redirigiendo usuario a portada de organizacion con URL privada " + ultimoPath);
 85                   
 86                } else {
 87                   
 88                    // comportamiento por defecto de liferay con defaultlandingpage...
 89                   
 90                    if (Validator.isNotNull(pathDefaultLandingPage)) {
 91                        LastPath lastPath = new LastPath(
 92                            StringPool.BLANK, pathDefaultLandingPage, new HashMap<String, String[]>());
 93                        
 94                        session.setAttribute(WebKeys.LAST_PATH, lastPath);
 95                        _log.info("redirigiendo usuario a DefaultLandingPage " + pathDefaultLandingPage);                        
 96                    }                   
 97                }
 98                   
 99               
100            } catch (Exception e) {
101                // TODO: handle exception               
102                e.printStackTrace();
103            }
104        }
105    }
106
107    private static Log _log = LogFactory.getLog(La3DefaultLandingPageAction.class);
108
109    private static void _mostrar_datos_peticion(HttpServletRequest req) {
110        _log.info("############################################");
111        Enumeration pNames = req.getParameterNames();               
112        while(pNames.hasMoreElements()) {                           
113            String name = (String)pNames.nextElement();                                                                                  
114            _log.info("parametro " + name + " = " + req.getParameter(name));       
115        }                                                            
116        _log.info("contextpath = " + req.getContextPath());       
117        _log.info("URI = " + req.getRequestURI());       
118        _log.info("querystring = " + req.getQueryString());       
119       
120        Enumeration hNames = req.getHeaderNames();               
121        while(hNames.hasMoreElements()) {                           
122            String name = (String)hNames.nextElement();                                                                                  
123            _log.info("header " + name + " = " + req.getHeader(name));       
124        }
125       
126        Enumeration aNames = req.getAttributeNames();
127        while (aNames.hasMoreElements()) {
128            String name = (String)aNames.nextElement();
129            _log.info("atributo " + name + " = " + req.getHeader(name));
130        }
131        _log.info("############################################");               
132       
133    }
134   
135}
Bernardo Riveira Faraldo
RE: land URL when login - Liferay(+CAS) not like other webapps
May 19, 2009 4:59 AM
Answer

Bernardo Riveira Faraldo

Rank: Regular Member

Posts: 136

Join Date: October 30, 2008

Recent Posts

also, you have to empty the "service url" form field in LifeRay CAS configuration! (if not, you will always be redirected to the same page as the "redirect" parameter is not used..

look at the attached picture
Attachment

Attachments: cas-config.gif (18.8k)
Jamie L Sammons
RE: land URL when login - Liferay(+CAS) not like other webapps
May 20, 2009 12:31 PM
Answer

Jamie L Sammons

Rank: Junior Member

Posts: 33

Join Date: November 18, 2008

Recent Posts

Awesome! Thanks for posting that. I'll give it a try and see how it goes.
Bernardo Riveira Faraldo
RE: land URL when login - Liferay(+CAS) not like other webapps
May 21, 2009 12:48 AM
Answer

Bernardo Riveira Faraldo

Rank: Regular Member

Posts: 136

Join Date: October 30, 2008

Recent Posts

BTW, you can safely trim the "_mostrar_datos_peticion(HttpServletRequest req)" function, as I used it just for debugging purposes (it just throws the parameters, session variables and the like to the log)
Anonymous
RE: land URL when login - Liferay(+CAS) not like other webapps
June 10, 2009 3:26 AM
Answer

Anonymous

Hi guys,

is it possible the the user will be redirected to the page it came from if the user came from liferay... and if they log in to cas directly they will be redirect to a certain page...


thanks in advance sorry for my poor english,



Bernardo Riveira Faraldo:
OF COURSE, there it goes... without warranty of any kind emoticon (to use opensource code like liferay and not showing up our code is not only illegal, but uneducated emoticon this is code copied and pasted from opensourced classes, so I suppose in compliance with the license it should be algo opensourced... emoticon

please don't use this as it comes, as THIS IS what we need, but maybe not what you need!

in the loginpreaction we save the "redirect" parameter in the session (if present)

 1
 2package com.mundor.la3.liferay;
 3
 4import com.liferay.portal.kernel.events.Action;                            
 5                                                                                                                                       
 6import javax.servlet.http.HttpServletRequest;                        
 7import javax.servlet.http.HttpServletResponse;                      
 8                                                                     
 9public class La3LoginPreAction extends Action {                  
10                                                                     
11    public void run(HttpServletRequest req, HttpServletResponse res) {                                    
12
13        // nos pillamos el parámetro redirect, es donde quería ir el cliente inicialmente
14        String redirect = req.getParameter("redirect");
15        if (redirect!=null && !("".equals(redirect))) {
16            // lo metemos en la sesión para usarlo en La3DefaultLandingPageAction
17            req.getSession().setAttribute("LA3_REDIRECT", redirect);
18        }
19    } 
20}


then in the new DefaultLandingPageAction we use that value; the code I put below here is somewhat more "convoluted" as it makes another change we needed... this is the pseudocode:

- if the user entered a full URL (we now because of the LA3_REDIRECT value we saved in the session) then she goes there!

- else, we look at their organizations; (we have more than one); our private organization pages should work as homepages for their users, and there is a "main" organization, so if a user belongs to more than one org, he should go there as first option, (that's why we check if the user organization first page is the same as the global DefaultLandingPage value; if true, the first page the user sees is that one; else, she is redirected to one of the organizations she is member of (we just get the last one)

- else, (should never happen) she goes to the lastpath as configured

  1
  2package com.mundor.la3.liferay;
  3
  4/**
  5 * Personalización para llegar hasta las organizaciones de un usuario
  6 */
  7
  8import com.liferay.portal.kernel.events.Action;
  9import com.liferay.portal.kernel.util.StringPool;
 10import com.liferay.portal.kernel.util.Validator;
 11import com.liferay.portal.model.Organization;
 12import com.liferay.portal.model.User;
 13import com.liferay.portal.struts.LastPath;
 14import com.liferay.portal.util.PortalUtil;
 15import com.liferay.portal.util.PropsKeys;
 16import com.liferay.portal.util.PropsValues;
 17import com.liferay.portal.util.WebKeys;
 18
 19import java.util.Enumeration;
 20import java.util.HashMap;
 21import java.util.List;
 22
 23import javax.servlet.http.HttpServletRequest;
 24import javax.servlet.http.HttpServletResponse;
 25import javax.servlet.http.HttpSession;
 26
 27import org.apache.commons.logging.Log;
 28import org.apache.commons.logging.LogFactory;
 29
 30
 31public class La3DefaultLandingPageAction extends Action {
 32
 33    public void run(HttpServletRequest request, HttpServletResponse response) {
 34       
 35        //_mostrar_datos_peticion(request);       
 36       
 37        HttpSession session = request.getSession();
 38       
 39        // esta es la DefaultLandingPage de portal-ext.properties:
 40        String pathDefaultLandingPage = PropsValues.DEFAULT_LANDING_PAGE_PATH;
 41       
 42        // primero vemos si no llegamos aqui con una URL a la que ir
 43       
 44        String redirect=(String)session.getAttribute("LA3_REDIRECT");
 45       
 46        if (redirect!=null && !("".equals(redirect))) {
 47            
 48            // el usuario llega a la3 con una URL completa, por lo que debemos
 49            // ir a esa..
 50            LastPath lastPath = new LastPath(
 51                    StringPool.BLANK, redirect, new HashMap<String, String[]>()) ;          
 52            session.setAttribute(WebKeys.LAST_PATH, lastPath);
 53            _log.info("redireccion detectada en La3LoginPreAction - " + redirect + " modificamos lastPath");
 54            
 55        } else {
 56
 57            // localizamos organizaciones a las que pertenece el usuario
 58            
 59            try {
 60                User usr = PortalUtil.getUser(request);
 61                List<Organization> orgs = usr.getOrganizations();
 62                boolean usarPathDefecto = false;
 63                String ultimoPath = null;
 64                
 65                for (Organization org : orgs) {
 66                    ultimoPath = "/liferay/group" + org.getGroup().getFriendlyURL();                   
 67                    _log.info("usuario pertenece a organizacion '"  + org.getName() + "' con URL privada " + ultimoPath);
 68                    if (pathDefaultLandingPage.startsWith(ultimoPath)) {
 69                        // el usuario pertenece a la org. principal,
 70                        // así que nos salimos ya y que vaya a esa
 71                        usarPathDefecto = true;
 72                        _log.info("es la misma organizacion de la URL de DefaultLandingPage");
 73                    }
 74                }
 75               
 76                // ahora, si no encontró la organización por defecto y tenemos al menos otra
 77                // vamos a esa otra (nos quedamos realmente con la última del bucle
 78               
 79                if (!usarPathDefecto && ultimoPath!=null) {
 80                    //vamos a esa...
 81                    LastPath lastPath = new LastPath(
 82                            StringPool.BLANK, ultimoPath, new HashMap<String, String[]>());                        
 83                    session.setAttribute(WebKeys.LAST_PATH, lastPath);
 84                    _log.info("redirigiendo usuario a portada de organizacion con URL privada " + ultimoPath);
 85                   
 86                } else {
 87                   
 88                    // comportamiento por defecto de liferay con defaultlandingpage...
 89                   
 90                    if (Validator.isNotNull(pathDefaultLandingPage)) {
 91                        LastPath lastPath = new LastPath(
 92                            StringPool.BLANK, pathDefaultLandingPage, new HashMap<String, String[]>());
 93                        
 94                        session.setAttribute(WebKeys.LAST_PATH, lastPath);
 95                        _log.info("redirigiendo usuario a DefaultLandingPage " + pathDefaultLandingPage);                        
 96                    }                   
 97                }
 98                   
 99               
100            } catch (Exception e) {
101                // TODO: handle exception               
102                e.printStackTrace();
103            }
104        }
105    }
106
107    private static Log _log = LogFactory.getLog(La3DefaultLandingPageAction.class);
108
109    private static void _mostrar_datos_peticion(HttpServletRequest req) {
110        _log.info("############################################");
111        Enumeration pNames = req.getParameterNames();               
112        while(pNames.hasMoreElements()) {                           
113            String name = (String)pNames.nextElement();                                                                                  
114            _log.info("parametro " + name + " = " + req.getParameter(name));       
115        }                                                            
116        _log.info("contextpath = " + req.getContextPath());       
117        _log.info("URI = " + req.getRequestURI());       
118        _log.info("querystring = " + req.getQueryString());       
119       
120        Enumeration hNames = req.getHeaderNames();               
121        while(hNames.hasMoreElements()) {                           
122            String name = (String)hNames.nextElement();                                                                                  
123            _log.info("header " + name + " = " + req.getHeader(name));       
124        }
125       
126        Enumeration aNames = req.getAttributeNames();
127        while (aNames.hasMoreElements()) {
128            String name = (String)aNames.nextElement();
129            _log.info("atributo " + name + " = " + req.getHeader(name));
130        }
131        _log.info("############################################");               
132       
133    }
134   
135}
Bernardo Riveira Faraldo
RE: land URL when login - Liferay(+CAS) not like other webapps
June 11, 2009 4:03 AM
Answer

Bernardo Riveira Faraldo

Rank: Regular Member

Posts: 136

Join Date: October 30, 2008

Recent Posts

Sorry, I'm not sure what your needs are :-? It seems related to what we have made, but...
garry b baal
RE: land URL when login - Liferay(+CAS) not like other webapps
June 14, 2009 8:40 PM
Answer

garry b baal

Rank: New Member

Posts: 4

Join Date: April 26, 2009

Recent Posts

Bernardo Riveira Faraldo:
Sorry, I'm not sure what your needs are :-? It seems related to what we have made, but...


Hi,


I have cas server and liferay server... my liferay uses cas to login here's some senario hope it will make it clear

I am in the /web/guest/sample1 then I login I should be redirected to /web/guest/sample1(assuming a successful login)

this works fine if I set auth.forward.by.last.path to true (with return me from where I logging)

the issue is when I login directly in Cas /login
I am redirecting to /user//home (which we don't user to there private page after login)
if we set default.landing.page.path=/web/guest/home this will solve the issue not allowing the user to go to there private page

but auth.forward.by.last.path will not work any more we will not return form what page we came from..


basically

we want user to return to the last path where they click sign in( liferay pages), now if the user logs-in directly in cas server (assuming they know the url) we want them to be redirected to /web/guest/home after login.

I don't how and where to fix this issue.. any suggestions?

thank Bernardo, thanks everyone in advance,