Get it on Google Play

Caso practico: Desarrollando una mejor User Experience(UX) en el login de Liferay 7 DXP

25-08-2016
 
Login Liferay DXP

Login Liferay DXP

Vamos a suponer que hemos desarrollado un portlet para una plataforma de contenidos que se puede insertar dentro de páginas de nuestros sites. Lo que queremos es que cuando nuestro usuario entre en la página de Login, cuando haga login o si ya esta logueado:

  • Si el usuario es miembro de un ‘site’ que tiene ese portlet que automáticamente se redirija a la página con el portlet.
  • Si el usuario es miembro de varios ‘sites’ que vaya a una página con el listado de páginas con el portlet(Otro portlet).
  • Si el usuario no es miembro de ningun ‘site’ que tenga el portlet que lo mande a una página X.

Con el nuevo sistema de módulos OSGI de Liferay solamente tendremos que implementar dos classes. La primera para que cuando el usuario haga login implemente la lógica de negocio mencionada arriba y la segunda para que cuando el usuario que ya este logueado entre en la página de login.

La classe, que implementa el evento ‘login.event.post’ quedaria de la siguiente manera(Se ejecuta cada vez que un usuario se loguea):

public class PostLoginAction implements LifecycleAction {

    	@Override
	public void processLifecycleEvent(LifecycleEvent lifecycleEvent) throws ActionException {
		try {
			User user=PortalUtil.getUser( lifecycleEvent.getRequest() );
			
			lifecycleEvent.getResponse().sendRedirect( getLandPage(user) );
		} catch (Exception e) { e.printStackTrace(); }
		}
    
    public static String getLandPage(User user) {
    		String firstPage=null;

		List<PortletPreferences> prefs=PortletPreferencesLocalServiceUtil.getPortletPreferenceses(-1, -1);
		List<Group> myGroups=new Vector<Group>();
		
		try {
			myGroups=GroupLocalServiceUtil.getUserGroups( user.getUserId() );
		} catch (Exception ex) { ex.printStackTrace(); }
		
		try {
			for ( PortletPreferences pref:prefs ) {
				if ( pref.getPortletId().equals( ConstantsUtil.PORTLET_ID ) ) {
					Layout l=LayoutLocalServiceUtil.getLayout( pref.getPlid() );

					if ( myGroups.contains( l.getGroup() ) )
					if (l.getGroup().isRegularSite()) {
						if ( firstPage!=null ) return “Página con el listado.”;
						firstPage=/group"+l.getGroup().getFriendlyURL()+l.getFriendlyURL();
						}
					}
				}
		} catch (Exception ex) { ex.printStackTrace(); }
    	
	if ( firstPage!=null ) return firstPage
    	
    	return "Página de descripción X";
    	}

}

La segunda classe que implementa el render del Login por si el usuario entra en la página de login y ya esta logueado(Vemos que utiliza el método ‘getLandPage’ de la otra página):

@Component(
	    property = { 
	        "javax.portlet.name=com_liferay_login_web_portlet_LoginPortlet",
	        "mvc.command.name=/" }, 
	    service = MVCRenderCommand.class)
public class LoginRedirect implements MVCRenderCommand {

	@Override
	public String render(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException {
		ThemeDisplay themeDisplay=(ThemeDisplay) renderRequest.getAttribute( WebKeys.THEME_DISPLAY );
		
		if ( themeDisplay.getPermissionChecker().isSignedIn() ) { 
				try {
					HttpServletResponse httpresp=PortalUtil.getHttpServletResponse(renderResponse);
					httpresp.sendRedirect( PostLoginAction.getLandPage(themeDisplay.getUser()) );				
				} catch (Exception ex) { ex.printStackTrace(); }
				}
		
		return null;
		}
}

La verdad es que el nuevo sistema de módulos OSGI hace mucho mas amigable el desarrollo de este tipo de soluciones. Espero que os resulte de utilidad :D.

Interesado en formación Liferay?

 

Comments

One Response to “Caso practico: Desarrollando una mejor User Experience(UX) en el login de Liferay 7 DXP”
  1. Horelvis says:

    Si, la verdad que el nuevo desarrollo con OSGI esta siendo una pasada!,

Leave a Reply

© Albert Coronado Calzada