Liferay 6开发学习(二十八):如何向Liferay中导入用户

2014年08月05日 Liferay 评论 3 条 阅读 13,382 views 次

当系统开发完成,部署实施上线时,需要初始化大量的用户数据,如果一个个的录入,数据量少时还好,如果数据量比较大,还是让人很崩溃的。此时,我们可以使用Liferay的API进行用户的导入,Liferay本身并没有提供CSV或EXCEL的用户导入方法,需要我们有一定的二次开发。

导入的方法大概有几种:

(注意:本文的说明是基于Liferay6.2.1的版本,其他版本可能稍有差异)

1、LDAP的导入,就是我们在的用户在LDAP中,让Liferay从LDAP中自动导入,这样的方法,可以参考前面的文章《Liferay 6开发学习(二十七):OpenLDAP与Liferay的集成》;

2、我们Liferay中写一个Portlet,调用Liferay的API进行导入。

3、我们在远程或者另外独立的工程中,调用Liferay的WebService接口进行导入。

写Portlet进行导入

只所以要建立一个Portlet,是因为我们在Portlet里面可以方便的调用Liferay的API,新建一个Portlet工程或者添加一个Portlet。调用下面的方法进行添加。

UserServiceUtil.addUser(companyId, autoPassword, password1, password2, autoScreenName, screenName, emailAddress, facebookId, openId, locale, firstName, middleName, lastName, prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle, groupIds, organizationIds, roleIds, userGroupIds, sendEmail, serviceContext)

说明:

1、添加时请保证使用超级管理员帐号登录,不然会可能会提示权限不足。

2、上面的companyId,可以从上下文件中使用PortalUtil.getCompanyId(request)获取。

3、autoPassword,一般设置为false。为true时,会自动的生成密码。

4、password1,和password2,就是密码,保持一致即可。

5、autoScreenName,一般为false;

6、screenName,屏幕名称,一般是字母和数字的组合,默认不能为全数字,如果要让他支持全数字,可以添加users.screen.name.allow.numeric=true,的配置到Portal-ext.properties文件中。

7、emailAddress,默认邮件地址为必填项,如果用户中没有邮件地址,则可以在后台中添加配置, users.email.address.required=false,设置为邮件地址为非必须。此时emailAddress可以传空值,否则会报错。

8、facebookId,openId等,这些一般没用,我们传值是可以facebookId传0l(facebookId为long类型),openId传"";

9、local,根据具体的情况吧,这个地方来存的是用户的语言项和时区,国内的一般可以使用固定值,或者是从request里面取,PortalUtil.getLocale(request);

10、firstName, middleName, lastName这几个值,很明显。一般是firstName为必值,其他几个可以传空。根据实际情况来传吧。

11、 prefixId, suffixId,前缀和后缀。国内我们一般都不用这些的,传值都传0即可。

12、male:是否是男性,传true或false;

13、birthdayMonth, birthdayDay, birthdayYear:生日的月、日、年,int类型,根据情况传,如果没有,可以传成1,1,1970.

14、jobTitle,职称等,根据情况传,没有的话传“”;

15、 groupIds, organizationIds, roleIds, userGroupIds:long类型的数级,分别为当前用户属于的站点、组织机构、角色、用户组等,如果不需要可以传null,如果有需要传long类型的数级,里面的值为相应的站点ID,组织机构ID等。如果不是以管理员账号登录,此处传值的话(传null不会),可能会出现权限错误。

16、sendEmail,是否给用户发邮件,根据情况来定吧,一般为false。

17、serviceContext,可以从上下文件中取ServiceContext serviceContext = ServiceContextFactory.getInstance(request);

特殊情况

比如现在有一个场景,是我们自己写一个用户的注册界面,又想在这个注册后就关联上相应的站点或组织机构,上面的接口必须要有权限才能添加,如何绕过相应的权限呢?调用下面的这个API。

UserLocalServiceUtil.addUserWithWorkflow(creatorUserId, companyId, autoPassword, password1, password2, autoScreenName, screenName, emailAddress, facebookId, openId, locale, firstName, middleName, lastName, prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle, groupIds, organizationIds, roleIds, userGroupIds, sendEmail, serviceContext)

这个API和上面的相比多一个参数,也就是第一个参数,创建的用户ID,这里可以传defaultUser.getUserId()。

User defaultUser = UserLocalServiceUtil.getDefaultUser(companyId);

其他的参数和上面的没有差别,用这个方法添加站点等时,不会再要有相应的权限。

远程调用WebService添加

上面的方法只是在我们自己的系统里面添加,但是有时候,我们又需要在外部写一个程序,或者是通过其他的系统调用接口添加用户。

此时,我们可以使用Liferay提供的API接口。http://localhost:8080/api/axis/Portal_UserService?wsdl,这是一个标准的WebService,里面有对应的接口方法添加。其他程序可以基于这样的一个标准的WebService自己写客户端调用添加。如果是Java,我们可以使用Liferay提供的客户端。

1、下载对应版本的客户端,可以在这里找到对应版本的,http://sourceforge.net/projects/lportal/files/Liferay%20Portal/,比如我们的是6.2.1的下载地址为http://downloads.sourceforge.net/project/lportal/Liferay%20Portal/6.2.1%20GA2/liferay-portal-client-6.2-ce-ga2-20140319114139101.zip

2、下载后,解压可以看到有一系列jar包,将这些jar包导入到我们的工程中,可以新建一个Java工程(和Liferay没关系,有没有Liferay环境也没有关系)

3、调用的核心代码如下:里面的参数的传递,参考上面的,基本一样。


UserServiceSoapServiceLocator locatorUser = new UserServiceSoapServiceLocator();
ServiceContext serviceContext = new ServiceContext();
try {
UserServiceSoap serviceUser = locatorUser.getPortal_UserService(getURL("Portal_UserService"));
UserSoap userSoap = serviceUser.addUser(10153l, true,"","",false, userName, "", 0l,"","zh_CN", userNike, "", "", 0,0, true, 1, 1, 1970, null,null, null, null, null, false, serviceContext);
serviceUser.updateStatus(userSoap.getUserId(), 0);
serviceUser.updatePassword(userSoap.getUserId(), password, password, false);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}

getURL方法,主要就是拼接了一下Liferay门户的地址,代码示例如下:

private static URL getURL(String serviceName) throws MalformedURLException {
String url = "http://localhost:8080";
String screenName = "test";
String password = "test";

int pos = url.indexOf("://");
String protocol = url.substring(0, pos + 3);
String host = url.substring(pos + 3, url.length());

StringBuilder sb = new StringBuilder();
sb.append(protocol);
sb.append(screenName);
sb.append(":");
sb.append(password);
sb.append("@");
sb.append(host);
sb.append("/api/axis/");
sb.append(serviceName);

return new URL(sb.toString());
}
用户头像

3 条留言  访客:2 条  博主:1 条

  1. 请问大神,组织和组等信息能导入么?

  2. 大神,我现在遇到了一些问题,由于需求 我需要在user_表中加入几个其他的userId完成与其他系统数据库中user表的关联, 我使用了jdbc连接完成新增用户,但是不知道liferay封装好的addUser方法 默认新增了哪些权限,您有社么好的建议吗

给我留言

您必须 登录 才能发表留言!

Copyright © IT人生录 保留所有权利.   主题设计 知更鸟 滇ICP备16001547号

用户登录

分享到: