当系统开发完成,部署实施上线时,需要初始化大量的用户数据,如果一个个的录入,数据量少时还好,如果数据量比较大,还是让人很崩溃的。此时,我们可以使用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里面可以方便的调用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);
其他的参数和上面的没有差别,用这个方法添加站点等时,不会再要有相应的权限。
上面的方法只是在我们自己的系统里面添加,但是有时候,我们又需要在外部写一个程序,或者是通过其他的系统调用接口添加用户。
此时,我们可以使用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、调用的核心代码如下:里面的参数的传递,参考上面的,基本一样。
帮助
01 02 03 04 05 06 07 08 09 10 11 12 13 14 |
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门户的地址,代码示例如下:
帮助
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 |
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()); } |