使用liferay往往不是使用liferay来重新开发一套系统,很多时候是使用liferay来开发一套集中处理的dashboard,这样的话往往就会存在一个用户验证的问题,本来有自己系统的用户验证,然后liferay也有自己的用户验证,这时候两个系统的统一就会显得特别的重要,查了一下网络,绝大多数的文章都是在讲SSO,基本也就是CAS跟OpenSSO两个,但是这两个都需要搭服务器,然后通过该服务器进行验证然后返回,还是无法避免原有系统整合的毛病。
这里想到一个思路就是在创建用户的时候调用liferay的api自己创建一个用户,然后这样用户在登陆的时候就可以无缝的用相同的用户名密码登录到liferay了。下面的材料是怎么用liferay的api创建用户的过程。
http://tanajilondhe.blogspot.com/2013/01/liferay-add-user-programmatically.html
几经折腾终于能存到liferay里面去了,核心代码如下。
private User createUser(String userName, String password) throws PortalException, SystemException {
Date date = new Date();
ServiceContext serviceContext = new ServiceContext();
serviceContext.setUuid(UUID.randomUUID().toString());
serviceContext.setCreateDate(date);
serviceContext.setModifiedDate(date);
long companyId = PortalUtil.getDefaultCompanyId();
long creatorUserId = 0;
boolean autoPassword = false;
boolean autoScreenName = false;
boolean male = true;
boolean sendEmail = false;
int prefixId = 1;
int suffixId = 1;
int birthdayMonth = 1;
int birthdayDay = 1;
int birthdayYear = 1970;
String screenName = userName + "ScreenName";
String jobTitle = "";
long[] groupIds = null;
long[] organizationIds = null;
long[] userGroupIds = null;
String password1 = password;
String password2 = password;
String firstName = userName + "firstname";
String emailAddress = userName + "@liferay.com";
long facebookId = 0;
String openId = "";
Locale locale = LocaleUtil.getDefault();
Role rolePu = RoleLocalServiceUtil.getRole(companyId, RoleConstants.POWER_USER);
long[] roleIds = { rolePu.getRoleId() };
User users43 = UserLocalServiceUtil.addUserWithWorkflow(creatorUserId, companyId, autoPassword, password1,
password2, autoScreenName, screenName, emailAddress, facebookId, openId, locale, firstName, "", "",
prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle, groupIds,
organizationIds, roleIds, userGroupIds, sendEmail, serviceContext);
return users43;
}
用户可以创建之后就是登陆的问题,找来找去找到一个介绍通过参数传递来达到登陆效果的文章:
http://www.liferaysavvy.com/2014/03/liferay-parameter-auto-login.html
基本思路就是通过url传递一个用户名密码过去,像下面的这个样子,
https://localhost:8080/c/portal/login?parameterAutoLoginLogin=10153¶meterAutoLoginPassword=test
这里面因为密码是明文的,所以需要自己做一下加密解密处理,具体系统使用的什么方案就不透漏了。
最终的SSO的解决方法就是:用户只需要注册业务系统,然后在业务系统提供一个跳转到liferay站点的链接,在跳转之后用loginHook解密密码进行liferay验证,如果验证通过那么向后传递验证信息,这时候会自动跳转到liferay的使用页面。