我想从我们的应用程序中自动登录我的用户。我知道liferay有一个自动登录功能,但我不知道如何使用它。我没有在网上找到很多有价值的信息。 我需要做些什么来使自动登录工作?
我想在用户点击链接时自动登录,无需输入姓名和密码。名称和密码保存在我们的应用程序数据库中。
答案 0 :(得分:40)
我相信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()
方法将尝试从许多来源(主要是请求对象)检索身份验证所需的信息。如果它确定用户应该登录,它将返回一个包含相关数据的数组以进行身份验证;如果它决定不将用户登录,则只能返回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
变量。在这种情况下,身份验证应该成功,并且自动登录类应该返回三个字符串的数组 - 凭据。这些是作为凭据返回的值,按照它们应该出现在数组中的顺序:
所以这是一行:
return new String[] {
String.valueOf(user.getUserId()),
user.getPassword(),
String.valueOf(user.isPasswordEncrypted())
};
但是,如果找不到用户,则会抛出异常。因此,我们必须使用try
/ catch
构造包围上面的代码。如果抛出异常,只需返回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
的{{1}}元素:
portal.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>
创建一个名为portal.properties
的文件。它应该包含一个名为docroot/WEB-INF/src
的属性,其值应该是我们类的名称:
auto.login.hooks
就是这样。部署此挂钩,您的自动登录将起作用。
正如我所说,你不应该使用这种不安全的“身份验证”方法。绕过它太容易了,甚至获得管理权限!但是,如果您按照这些步骤操作,则可以使用骨架来创建更好的自动登录功能。此外,我知道有些人真的想要做一些像这种不安全的“身份验证”方法,有时我们必须暂停我们的判断,只是帮助一个人射击......
答案 1 :(得分:2)
步骤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<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;
}
步骤4:如果身份验证失败,您还可以通过以下代码重定向任何页面
if(Validator.isNull(credentials) || credentials[0]==null){
req.setAttribute(AutoLogin.AUTO_LOGIN_REDIRECT, “Your Login page path”);
}
答案 2 :(得分:1)
“autologin”究竟是什么意思?如果您希望Liferay检查用户是否已经过某个外部实体(例如CAS的单点登录服务器)的身份验证,您可以在portal.properties中启用它。它已经预先配置了liferay支持的身份验证机制。否则,您可能需要实现自己的自动挂钩(例如this post中所示
)答案 3 :(得分:0)
很好找到了。 第1步:单击添加iframe,然后弹出配置视图。 第2步:提供网址,如果有任何变量,如(www.mysite.com/Action=Login&User ...),请在隐藏变量文本字段中添加操作=登录。 步骤3:单击authenticate并选择基于表单的身份验证。在这里,让我们正确地给出用户字段名称和密码字段名称,值将是'@screen_name @','@ password @'。
例如,假设网址类似于www.mysite.com/Action=Login?User=aj&Password=aj。 用户名(字段)=用户 密码(字段)=密码 用户名(值)= aj 密码(值)= aj 隐藏变量(字段)=操作=登录
现在,只要有任何用户登录到liferay应用程序,如果他/她的帐户存在于指定的站点(在URL中),它将自动登录到该站点(就像单点登录一样)。
这很有效!!! -AJ