Luk*_*uke 10 java liferay autologin
我想从我们的应用程序中自动登录我的用户.我知道liferay有一个自动登录功能,但我不知道如何使用它.我没有在网上找到很多有价值的信息.我需要做些什么来使自动登录工作?
我想在用户点击链接时自动登录,无需输入姓名和密码.名称和密码保存在我们的应用程序数据库中.
bra*_*zzi 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;
}
}
Run Code Online (Sandbox Code Playgroud)
该AutoLogin.login()方法将尝试从许多来源(主要是请求对象)检索身份验证所需的信息.如果它确定用户应该登录,它将返回一个包含相关数据的数组以进行身份验证; 如果它决定不登录用户,它就可以返回null.
在我们的例子中,我们尝试insecurely_login_user从请求的参数中获取用户的名称.如果有这样的参数,我们将继续登录; 如果没有这样的参数,它只返回null:
String screenName = request.getParameter("insecurely_login_user");
if (screenName == null || screenName.isEmpty()) {
return null;
}
Run Code Online (Sandbox Code Playgroud)
所以我们有屏幕名称.现在做什么?让我们从数据库中获取具有相同屏幕名称的用户.
long companyId = PortalUtil.getCompanyId(request);
User user = UserLocalServiceUtil.getUserByScreenName(companyId,
screenName);
Run Code Online (Sandbox Code Playgroud)
如果存在具有这样的屏幕名称的用户,则将检索该属性并将其归因于该user变量.在这种情况下,身份验证应该是成功的,并且自动登录类应该返回三个字符串的数组 - 凭证.这些是作为凭据返回的值,按照它们应该出现在数组中的顺序:
所以这是一行:
return new String[] {
String.valueOf(user.getUserId()),
user.getPassword(),
String.valueOf(user.isPasswordEncrypted())
};
Run Code Online (Sandbox Code Playgroud)
但是,如果找不到用户,则会抛出异常.所以,我们必须用try/ catchconstruction 包围上面的代码.如果抛出异常,只需返回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;
}
Run Code Online (Sandbox Code Playgroud)
最后,这是我的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们的钩子应该将此类注册为自动登录处理器.这真的很容易.
首先,编辑文件,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>
Run Code Online (Sandbox Code Playgroud)
现在,创建一个名为portal.properties的docroot/WEB-INF/src.它应该包含一个名为auto.login.hooks的属性,其值应该是我们类的名称:
auto.login.hooks=br.brandizzi.adam.liferay.insecure.InsecureAutoLogin
Run Code Online (Sandbox Code Playgroud)
就是这样.部署此挂钩,您的自动登录将工作.
正如我所说,你不应该使用这种不安全的"身份验证"方法.绕过它太容易了,甚至获得管理权限!但是,如果您按照这些步骤操作,则可以使用骨架来创建更好的自动登录功能.此外,我知道有些人真的想做一些像这种不安全的"认证"方法,有时我们不得不暂停我们的判断,只是帮助一个人射击......
“自动登录”到底是什么意思?如果您希望 Liferay 检查用户是否已经通过某些外部实体(例如作为 CAS 的单点登录服务器)进行身份验证,您只需在 Portal.properties 中启用它即可。那里已经针对 liferay 支持的身份验证机制进行了预配置。否则,您可能需要实现自己的自动登录挂钩(例如本文中所示)