Get it on Google Play

Desarrollo de Portlet para loguearse en Liferay

12-07-2011
 

Hace tiempo escribí el post “Patrón de diseño para integración Liferay con otros sistemas“, esta solución nos sirve para hacer login al sistema validando los usuarios desde otra aplicación. Si lo hacemos a través de un portlet con el SDK, en lugar de tocar el core de Liferay con el entorno de extensión, tiene la ventaja que es una solución mucho menos acoplada al sistema, reutilizable y nos queda un diseño mas limpio.

Para implementar el portlet los puntos claves son (Miraos primero el esquema del post anterior):
La vista:
<form method='post' action='<portlet:resourceURL />'>
Username: <input type='text' name='username' /><br/>
Password: <input type='password' name='password' /><br/><br/>
<input type='submit' value='enviar' />
</form>

Aquí la única complicación es pensar en el tipo de petición que hacemos ‘resourceURL‘ (Como si de una imagen o PDF se tratara). Hacemos este tipo de petición porque cuando nos logueamos en Liferay necesitamos escribir cookies para la sesión, si no lo hacemos así no funcionará.

Algorismo de la clase controladora que recibe la petición:
PortletURL pu=response.createRenderURL();

if ( validarUserPass( username, password ) ) {

if ( !userExist( username ) ) {
addUser( username, password );
}

if ( !login( username+"@importado.com", password, themeDisplay, req, res ) ) {
pu.setParameter("error", "Algo falló al loguear el usuario.");
} else {
pu.setParameter("ok", "1");
}

} else {
pu.setParameter("error", "Usuario/Password incorrecto.");
}

res.sendRedirect( pu.toString() );

Finalmente, la función clave de esto es login, y es la siguiente:

private boolean login( String username, String password, ThemeDisplay themeDisplay, javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse res ) {
try {
ClassLoader cl=PortalClassLoaderUtil.getClassLoader();
Class loginUtil=cl.loadClass("com.liferay.portlet.login.util.LoginUtil");

java.lang.reflect.Method login=loginUtil.getDeclaredMethod("login", new Class[] { javax.servlet.http.HttpServletRequest.class, javax.servlet.http.HttpServletResponse.class, String.class, String.class, boolean.class, String.class } );

login.invoke( null, new Object[] { req, res, username, password, true, com.liferay.portal.model.CompanyConstants.AUTH_TYPE_EA } );

return true;
} catch (Exception ex) { ex.printStackTrace(); }

return false;
}

Atención, debemos cargar la clase “LoginUtil” a través del ‘class loader’ de la clase “PortalClassLoaderUtil” y hacemos uso del método ‘login’. Recordad que este método guarda cookies y por eso tenemos que hacer una petición como si quisiéramos servir un recurso (Imágenes, PDFs, etc.).

De esta manera podemos implementar un portlet con un formulario de validación o un portlet que nos permita validar a través de una URL, que nos permite una integración mucho mas limpia con otros sistemas de la empresa.

Próximamente encapsularé este portlet y lo colgaré en el en Liferay.com para compartirlo con la comunidad y a ver si le sirve a mas gente.

Interesado en formación Liferay?

 

Comments

10 Responses to “Desarrollo de Portlet para loguearse en Liferay”
  1. Francisco Javierº says:

    Hola Albert,

    gracias por el artículo, es interesante.

    Soy nuevo en liferay y me preguntaba si podrías adjuntar o enviarme el código completo ([email protected]) del que haces uso para este artículo.

    Gracias. Un saludo.

  2. Intentaré escribir un post pronto con el código fuente entero.

  3. Antonio says:

    Estoy muy interesado en logar a través de una URL desde otra aplicación, pero estoy tan pelado en java que me suena casi a chino lo que comentas.

    Así que me ha gustado sobre todo lo de que pondrás el porlet en liferay.com

    Espero ansioso.

    Gracias un saludo.

  4. Gracias Antonio, intentaré que sea pronto… Un saludo,

  5. Leo Barrientos says:

    Hola,

    Podrias publicar el codigo e indicar como cololar nuevas cookies en la session de usuario.

    Saludos y gracias.

  6. Breanna says:

    Gracias por el aporte, pero ahora tengo una duda yo estoy nausdo esta sentencia en un action de un portlet y si quiero llamar a un portlet al estilo popup desde este portlet donde debo ubicar a lo que le llamas creando el portlet? lo ubico en el portlet que va a ser el popup o en el mismo portlet desde donde lo voy a llamar?

  7. No se muy bien por donde vas, pero creo que tendrías que ponerlo en el Theme.

  8. Hola Albert,

    Tendrás ya el código completo del portlet. Si es posible que lo publiques pues me servirá de base para realizar la integración con LDAP y CAS.

    Saludos y Gracias.

  9. Hola Leo,

    Liferay ya se integra con LDAP y CAS, lamento tardar tanto en contestar, estaba de vacaciones.

    Saludos,

Leave a Reply

© Albert Coronado Calzada