lunedì 30 luglio 2012

AutoLogin con Liferay


Per chi ha dovuto come me, combattere con il CMS Java Liferay, sa benissimo che customizzare la portlet di Login standard è quasi impossibile, sempre se non vengono implementati degli Hook (pre o post) per la Login.


Dopo giorni di ricerca sono riuscito a trovare un modo semplice e veloce per risolvere il mio problema.


Per prima cosa create una vostra portlet, che sostituirà quella di Login standard inserendo i texfield necessari:

  • username (o email, dipende dalla vostra configurazione interna di login)
  • password

E per finire un bottone di submit.


Se la vostra portlet alla pressione del tasto submit si ridirige ad un action di struts, nel metodo invocato dovremmo:

  1. controllare che i campi non siano vuoti 
  2. controllare che l'utenza può fare la login
    • result =  UserLocalServiceUtil.authenticateByScreenName(companyId, username, password, headerMap, parameterMap);
    • result =  UserLocalServiceUtil.authenticateByEmailAddress(companyId, username, password, headerMap, parameterMap);
  3. se torna 0 l'utente non è presente all'interno del nostro db oppure la password è errata, nel caso gestiamo anche con un try/catch la NoSuchUserException
  4. dopo aver validato l'accesso chiamiamo il nostro link per l'autenticazione liferay
    • String url = "NOSTROHOST/web/guest?parameterAutoLoginLogin=MAILorUSERNAME&parameterAutoLoginPassword=ENCRYPTEDPASSWORD";
    • ((ActionResponse) response).sendRedirect(url);


IMPORTANTE

  • La password può essere passata al link sia in chiaro che criptata (letta direttamente dal db attraverso un getUser del famosissimo UserLocalServiceUtil)
  • Se usiamo un Action di Struts2 per ottenere la response dovremmo implementare:
    • public class LoginCustomAction extends ActionSupport implements PortletRequestAware,PortletResponseAware {
    • ed il metodo
      • @Override
      • public void setPortletResponse(PortletResponse response) {this.response = response;}
  • inoltre dobbiamo aggiungere nel nostro portal-ext.properties
    • auto.login.hooks=com.liferay.portal.security.auth.CASAutoLogin,com.liferay.portal.security.auth.NtlmAutoLogin,com.liferay.portal.security.auth.OpenIdAutoLogin,com.liferay.portal.security.auth.OpenSSOAutoLogin,com.liferay.portal.security.auth.ParameterAutoLogin
  •  i controlli sulla validità dell'utente sono stati fatti per evitare il fallimento della login, poichè in quel caso la servlet per l'autenticazione ci ridirigerebbe sulla portlet standard di login di Liferay con un errore di accesso.



Il risultato che si ottiene è l'utente loggato correttamente nel portale senza aver introdotto modifiche "invasive" nel sistema.


Enjoy


Lolled

Nessun commento:

Posta un commento