2011-07-22 42 views
10

Quiero iniciar sesión en mis usuarios automáticamente desde nuestra aplicación. Sé que liferay tiene una función de inicio de sesión automático, pero no sé cómo usarla. No encontré mucha información valiosa en la web. ¿Qué debo hacer para que funcione la autopsia?¿Cómo uso autologin en liferay?

Quiero iniciar sesión en un usuario automáticamente cuando hace clic en un enlace, sin que él tenga que ingresar el nombre y la contraseña. El nombre y la contraseña se guardan en nuestra base de datos de aplicaciones.

Respuesta

1

¿Qué quiere decir exactamente "autologin"? Si desea que Liferay compruebe si el usuario ya está autenticado por alguna entidad externa (como un servidor de inicio de sesión único como CAS), puede habilitarlo en el portal.properties. Ya está preconfigurado para los mecanismos de autenticación compatibles con liferay. De lo contrario, puede que tenga que implementar su propio gancho de inicio de sesión automático (como se indica en this post por ejemplo

+0

Quiero iniciar sesión un usuario de forma automática cuando se hace clic en un enlace, sin él tener que introducir el nombre y la contraseña . El nombre y la contraseña se guardan en nuestra base de datos de aplicaciones. – Luke

+1

Aunque no sé por qué uno querría hacer eso: podría verificar la aplicación de muestra de LR que tiene este mecanismo como demostración ("iniciar sesión como Bruno", etc.). Aparte de eso, recomiendo utilizar algo como OpenID o CAS para minimizar el esfuerzo de inicio de sesión de los usuarios pero manteniendo un cierto nivel de seguridad. – Dirk

+2

de acuerdo: Vaya con cualquier sistema de inicio de sesión único (por ejemplo, CAS) para que los usuarios solo se autentiquen una vez (o, si insisten, usen NTLM) y esta identidad se lleva a las aplicaciones. Se supone que las soluciones como el inicio de sesión de Bruno son para demostración, no para producción. También podría darle más permisos a su usuario invitado anónimo, para que ni siquiera necesite iniciar sesión si considera una solución de este tipo. –

0

Bueno encontró . Paso 1: Haga clic en iframe complemento y dejar que la configuración de la vista emergente . Paso 2: Proporcionar la url y si hay variables como (www.mysite.com/Action=Login & Usuario ...), agregue el campo de acción Acción = Iniciar sesión en variables ocultas Paso 3: haga clic en autenticar y seleccione la autenticación basada en formularios. usre que el nombre del campo del usuario y el nombre del campo de la contraseña se dan correctamente, y los valores serán '@screen_name @', '@ password @'.

Por ejemplo, supongamos que la url es algo así como www.misitio.com/Acción = Iniciar sesión? Usuario = aj & Contraseña = aj. Nombre de usuario (campo) = Usuario contraseña (campo) = contraseña Nombre de Usuario (Valor) = aj contraseña (Valor) = aj variables ocultas (campo) = acción = Entrar

Ahora, cuando cualquier usuario inicia sesión en la aplicación liferay, si su cuenta existe en el sitio especificado (en la url), iniciará sesión automáticamente en ese sitio (actúa como un inicio de sesión único).

Esto funciona! -Aj

38

Creo que el OP no tiene uso para una respuesta ahora. Sin embargo, esto merece una respuesta integral. De hecho, estoy sorprendido de que todavía no tenga uno.

En primer lugar, esta es una mala idea: una disposición como la propuesta por el OP es realmente demasiado insegura. Sin embargo, una solución al problema descrito puede ser un buen prototipo para alguien que esté creando un autologin para Liferay.

Ahora, digamos que desea iniciar sesión automáticamente en cualquier usuario cuyo nombre de pantalla se envíe en un parámetro de cadena de consulta. Por ejemplo, si uno accede al http://localhost:8080/web/guest/home?insecurely_login_user=juju, entonces el Liferay en el usuario juju debe iniciar sesión. ¿Cómo hacer eso? Siga los pasos a continuación:

crear la clase de sesión automático

En primer lugar, crear un plugin gancho. En su directorio docroot/WEB-INF/src, crea una clase que implementa la interfaz com.liferay.portal.security.auth.AutoLogin. En mi ejemplo, lo llamaré br.brandizzi.adam.liferay.insecure.InsecureAutoLogin.

La interfaz AutoLogin tiene sólo un método, llamado login(), que espera dos parámetros (a HttpServletRequest y un HttpServletResponse instancias) y devuelve una matriz de cadenas.Por lo tanto, mi clase se verá así sin aplicación:

public class InsecureAutoLogin implements AutoLogin { 

    @Override 
    public String[] login(HttpServletRequest request, 
      HttpServletResponse response) throws AutoLoginException { 
     // TODO Auto-generated method stub 
     return null; 
    } 

} 

El método AutoLogin.login() intentará recuperar la información necesaria para la autenticación de muchas fuentes, principalmente el objeto de solicitud. Si decide que el usuario debe iniciar sesión, devuelve una matriz con datos relevantes para la autenticación; si decide no iniciar sesión en el usuario, puede simplemente devolver null.

En nuestro caso, tratamos de obtener el nombre del usuario del parámetro insecurely_login_user de la solicitud. Si hay tal parámetro, procederemos con el inicio de sesión; Si no hay tal parámetro, sólo se devuelve null:

String screenName = request.getParameter("insecurely_login_user"); 
if (screenName == null || screenName.isEmpty()) { 
    return null; 
} 

Así que tienen el nombre de pantalla. ¿Qué hacer ahora? Permítanos obtener un usuario de la base de datos con el mismo nombre de pantalla.

long companyId = PortalUtil.getCompanyId(request); 
User user = UserLocalServiceUtil.getUserByScreenName(companyId, 
     screenName); 

Si una pantalla de un nombre de usuario, tales wich existe, se recuperará y se atribuye a la variable user. En este caso, la autenticación debería ser exitosa y la clase autologin debería devolver una matriz de tres cadenas: las credenciales . Esos son los valores que se devuelven como credenciales, en el orden en que deben aparecer en la matriz:

  • el ID de usuario como una cadena
  • la contraseña del usuario, que puede ser cifrada o no;
  • un valor booleano, enviar a cadena, que indica si la contraseña está encriptada.

Así que aquí es la línea:

return new String[] { 
    String.valueOf(user.getUserId()), 
    user.getPassword(), 
    String.valueOf(user.isPasswordEncrypted()) 
}; 

Si no se encuentra un usuario, sin embargo, se produce una excepción. Entonces, tenemos que rodear el código anterior con una construcción try/catch. Si se produce una excepción, simplemente volver null:

try { 
    long companyId = PortalUtil.getCompanyId(request); 
    User user = UserLocalServiceUtil.getUserByScreenName(companyId, 
      screenName); 
    return new String[] { String.valueOf(user.getUserId()), 
      user.getPassword(), 
      String.valueOf(user.isPasswordEncrypted()) }; 
} catch (Exception e) { 
    return null; 
} 

Al final, esto es mi clase InsecureAutoLogin:

public class InsecureAutoLogin implements AutoLogin { 
    public String[] login(HttpServletRequest request, 
      HttpServletResponse response) throws AutoLoginException { 

     String screenName = request.getParameter("insecurely_login_user"); 
     if (screenName == null || screenName.isEmpty()) 
      return null; 

     try { 
      long companyId = PortalUtil.getCompanyId(request); 
      User user = UserLocalServiceUtil.getUserByScreenName(companyId, 
        screenName); 
      return new String[] { String.valueOf(user.getUserId()), 
        user.getPassword(), 
        String.valueOf(user.isPasswordEncrypted()) }; 
     } catch (Exception e) { 
      return null; 
     } 

    } 
} 

El registro de la clase de sesión automático

Ahora nuestro gancho debe registrar esta clase como un procesador de autologin Eso es realmente fácil.

En primer lugar, editar el archivo docroot/WEB-INF/liferay-hook.xml adición de un elemento con el valor portal-propertiesportal.properties:

<?xml version="1.0"?> 
<!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.1.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_1_0.dtd"> 

<hook> 
    <portal-properties>portal.properties</portal-properties> 
</hook> 

Ahora, cree un archivo llamado portal.properties en docroot/WEB-INF/src. Debe contener una propiedad denominada auto.login.hooks cuyo valor debe ser el nombre de nuestra clase:

auto.login.hooks=br.brandizzi.adam.liferay.insecure.InsecureAutoLogin 

Y eso es todo. Despliega este gancho y tu autologin funcionará.

Conclusión

Como ya he dicho, que no debe utilizar un método tan insegura "autenticación". Es muy fácil evitarlo, ¡obteniendo permisos de administración uniformes! Sin embargo, si sigues estos pasos, tienes un esqueleto para crear una mejor función de autologin. Además, sé que algunas personas realmente quieren hacer algo como este método inseguro "autenticación" y, a veces tenemos que suspender nuestros juicios y simplemente ayudar a uno para disparar los pies de uno ...

El código fuente de este proyecto puede encuentre here y puede descargar WAR here.

+1

+1 Bien explicado –

+0

Buen tutorial, Gracias :-) –

+0

¿Sabes si hay una manera de recuperar la matriz de credenciales devuelta desde el método de inicio de sesión() desde un portlet o servlet? thx – acvcu

2

Paso 1: Cree una clase CustomLoginFilter e implemente desde la interfaz de AutoLogin. Elimine el método de inicio de sesión. Código de la siguiente manera.

public String[] login(HttpServletRequest req, HttpServletResponse response)throws AutoLoginException { 

//Get the login parameter 

String loginEmailId = ParamUtil.getString(req, “_58_login”); 

String password = req.getParameter(“_58_password”); 

String[] credentials = new String[3]; 

credentials[0] = userId 

credentials[1] = loginEmailId; 

credentials[2] = password; 

//Write your business logic Here and return String[]. 

} 

Paso 2: Escribir debajo de código en portal-ext.properties

// you get full control from this custom class. 

auto.login.hooks=com.bolog.portal.login.security.CustomLoginFilter 

//Override Liferay Authentication pipeline 

auth.pipeline.enable.liferay.check=false 

auth.pipeline.pre=com.bolog.portal.login.security.CustomLoginAuthenticator 

Paso 3: Crear CustomLoginAuthenticator clase y los implementos de Authenticator.

Override authentication methods. 

public int authenticateByEmailAddress(long arg0, String arg1, String arg2, 

Map<String, String[]> arg3, Map<String, String[]> arg4) 

throws AuthException { 

//Write Your business login here and if authentication success then return 1 otherwise return 0; 

return 0; 

} 

public int authenticateByScreenName(long arg0, String arg1, String arg2, 

Map<String, String[]> arg3, Map<String, String[]> arg4) 
throws AuthException { 

//Write Your business login here and if authentication success then return 1 otherwise return 0; 
return 0; 
} 

public int authenticateByUserId(long arg0, long arg1, String arg2, 
Map<String, String[]> arg3, Map<String, String[]> arg4) 
throws AuthException { 

//Write Your business login here and if authentication success then return 1 otherwise return 0; 
return 0; 
} 

Paso 4: Si la autenticación falla, entonces también puede redirigir cualquier página siguiente código

if(Validator.isNull(credentials) || credentials[0]==null){ 

req.setAttribute(AutoLogin.AUTO_LOGIN_REDIRECT, “Your Login page path”); 

} 
Cuestiones relacionadas