我想从我们的应用程序中自动登录我的用户。我知道liferay有一个自动登录功能,但我不知道如何使用它。我在网上没有找到太多有价值的信息。我需要做什么才能让autologin工作?
我想登录一个用户,当他点击一个链接时,自动登录,而不必输入名称和密码。名称和密码保存在我们的应用程序数据库中。
发布于 2013-02-22 01:24:57
我相信行动组现在不需要答案了。尽管如此,这需要一个全面的答案。事实上,我很惊讶它还没有一个。
首先,这是一个坏主意:像OP提出的这种安排真的太不安全了。然而,对于为Liferay创建autologin的人来说,所描述的问题的解决方案可以是一个很好的原型。
现在,假设您想要自动登录其屏幕名称在查询字符串参数中发送的任何用户。例如,如果访问http://localhost:8080/web/guest/home?insecurely_login_user=juju,则juju用户中的Liferay应已登录。如何做到这一点?请按照以下步骤操作:
创建autologin类
首先,创建一个钩子插件。在其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()方法将尝试从许多来源(主要是request对象)检索身份验证所需的信息。如果它决定用户应该登录,它将返回一个包含用于身份验证的相关数据的数组;如果它决定不让用户登录,它可以只返回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变量。在这种情况下,身份验证应该是成功的,并且autologin类应该返回一个包含三个字符串的数组--凭证。以下是要作为凭据返回的值,按它们在数组中的出现顺序排列:
下面是这行字:
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;
}
}
}注册autologin类
现在我们的钩子应该将这个类注册为autologin处理器。这真的很简单。
首先,编辑文件docroot/WEB-INF/liferay-hook.xml,添加一个值为portal.properties的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>现在,在docroot/WEB-INF/src上创建一个名为portal.properties的文件。它应该包含一个名为auto.login.hooks的属性,它的值应该是我们的类名:
auto.login.hooks=br.brandizzi.adam.liferay.insecure.InsecureAutoLogin就是这样。部署这个钩子,你的自动登录就可以工作了。
结论
正如我已经说过的,您不应该使用这种不安全的“身份验证”方法。绕过它太容易了,甚至可以获得管理权限!然而,如果你遵循这些步骤,你就有了一个骨架来创建更好的autologin特性。此外,我知道有些人真的想做一些像这种不安全的“身份验证”方法,有时我们不得不暂停我们的判断,只是帮助一个人踢自己的脚……
发布于 2014-11-03 19:24:52
步骤1:创建一个CustomLoginFilter类,并从AutoLogin interface.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:从验证器创建类CustomLoginAuthenticator和implements。
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”);
}发布于 2011-07-22 16:56:08
你说的"autologin“到底是什么意思?如果你想让Liferay检查用户是否已经通过了某个外部实体(比如单点登录服务器)的身份验证,你可以在portal.properties中启用它。在那里,它已经为liferay支持的身份验证机制进行了预先配置。否则,您可能需要实现自己的自动登录钩子(例如,如this post中所示
https://stackoverflow.com/questions/6787586
复制相似问题