如何在liferay中使用自动登录?

我想从我们的应用程序中自动登录我的用户。 我知道liferay有一个自动登录function,但我不知道如何使用它。 我在网上找不到很多有价值的信息。 我需要做些什么来使自动登录工作?

我想在用户点击链接时自动登录,无需输入姓名和密码。 名称和密码保存在我们的应用程序数据库中。

我相信OP现在没有用的答案。 尽管如此,这应该得到一个全面的答案。 事实上,我很惊讶它还没有。

首先,这是一个坏主意:OP提出的这种安排实在太不安全了。 然而,对于为Liferay创建自动登录的人来说,所描述问题的解决方案可能是一个很好的原型。

现在,我们假设您要自动登录在查询字符串参数中发送其屏幕名称的任何用户。 例如,如果访问http://localhost:8080/web/guest/home?insecurely_login_user=juju那么juju用户中的Liferay应该登录。如何做到这一点? 请按照以下步骤操作:

创建自动登录类

首先,创建一个hook插件。 在其docroot/WEB-INF/src目录中,创建一个实现com.liferay.portal.security.auth.AutoLogin接口的类。 在我的例子中,我将其br.brandizzi.adam.liferay.insecure.InsecureAutoLogin

AutoLogin接口只有一个名为login() ,它需要两个参数(一个HttpServletRequest和一个HttpServletResponse实例)并返回一个字符串数组。 所以,我的课程看起来没有实现:

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

AutoLogin.login()方法将尝试从许多来源(主要是请求对象AutoLogin.login()检索身份validation所需的信息。 如果它确定用户应该登录,它将返回一个包含相关数据的数组以进行身份​​validation; 如果它决定记录用户,它只能返回null

在我们的示例中,我们尝试从请求的insecurely_login_user参数中获取用户的名称。 如果有这样的参数,我们将继续登录; 如果没有这样的参数,它只返回null

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

所以我们有屏幕名称。 现在做什么? 让我们从数据库中获取具有相同屏幕名称的用户。

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

如果存在这样的屏幕名称的用户,则将检索该user并将其归因于user变量。 在这种情况下,身份validation应该是成功的,并且自动登录类应该返回三个字符串的数组 – 凭证 。 这些是作为凭据返回的值,按照它们应该出现在数组中的顺序:

  • 用户id为字符串
  • 用户的密码,可以加密或不加密;
  • 一个布尔值,强制转换为字符串,表示密码是否已加密。

所以这是一行:

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

但是,如果找不到用户,则会抛出exception。 因此,我们必须使用try / catch构造包围上面的代码。 如果抛出exception,只返回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; } 

最后,这是我的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; } } } 

注册自动登录类

现在我们的钩子应该将此类注册为自动登录处理器。 这真的很容易。

首先,编辑文件docroot/WEB-INF/liferay-hook.xml添加一个portal-properties元素,其值为portal.properties

    portal.properties  

现在,在docroot/WEB-INF/src创建一个名为portal.properties的文件。 它应该包含一个名为auto.login.hooks的属性,其值应该是我们类的名称:

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

就是这样。 部署此挂钩,您的自动登录将起作用。

结论

正如我所说,你不应该使用这种不安全的“身份validation”方法。 绕过它太容易了,甚至获得管理权限! 但是,如果您按照这些步骤操作,则可以使用骨架来创建更好的自动登录function。 此外,我知道有些人真的想做一些像这种不安全的“认证”方法,有时我们不得不暂停我们的判断,只是帮助一个人射击……

可在此处找到此项目的源代码,您可以在此处下载WAR。

步骤1:创建一个类CustomLoginFilter并从AutoLogin接口实现.Override登录方法。 代码如下。

 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[]. } 

第2步:在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 

第3步:从Authenticator创建类CustomLoginAuthenticator并实现。

 Override authentication methods. public int authenticateByEmailAddress(long arg0, String arg1, String arg2, Map arg3, Map 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 arg3, Map 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 arg3, Map arg4) throws AuthException { //Write Your business login here and if authentication success then return 1 otherwise return 0; return 0; } 

第4步:如果身份validation失败,您还可以通过以下代码重定向任何页面

 if(Validator.isNull(credentials) || credentials[0]==null){ req.setAttribute(AutoLogin.AUTO_LOGIN_REDIRECT, “Your Login page path”); } 

“autologin”究竟是什么意思? 如果您希望Liferay检查用户是否已经过某个外部实体(如CAS的单一登录服务器)的身份validation,您可以在portal.properties中启用它。 它已经预先配置了liferay支持的身份validation机制。 否则,您可能需要实现自己的自动挂钩(例如,如本文所示)

好吧,发现它。 第1步:单击添加iframe,然后弹出配置视图。 第2步:提供url,如果有任何变量,如(www.mysite.com/Action=Login&User …),请在隐藏变量文本字段中添加操作=登录。 步骤3:单击authenticate并选择基于表单的身份validation。 在此,请准确指出用户字段名称和密码字段名称,值为’@screen_name @’,’@ password @’。

例如,假设url类似于www.mysite.com/Action=Login?User=aj&Password=aj。 用户名(字段)=用户密码(字段)=密码用户名(值)= aj密码(值)= aj隐藏变量(字段)=操作=登录

现在,只要有任何用户登录到liferay应用程序,如果他/她的帐户存在于指定的站点(在URL中),它将自动登录到该站点(就像单点登录一样)。

这个工作!!! -AJ

Interesting Posts