Liferay json Web 服务:添加用户不起作用?
Posted
技术标签:
【中文标题】Liferay json Web 服务:添加用户不起作用?【英文标题】:Liferay json web service: add-user not working? 【发布时间】:2014-01-03 08:58:54 【问题描述】:我正在创建一个使用 json Web 服务连接到 Liferay 6.2 门户的应用程序。 我已经配置了身份验证参数,然后我可以成功使用多个 Web 服务(即“usergroup/add-user-group”工作正常)。
当尝试使用“add-user”添加新用户时,出现下一个错误:
"exception":"No JSON web service action associated with path /user/add-user and method POST for /"
我从here了解到,这个错误可能是因为某些参数不正确或丢失,因此找不到正确的Web服务,但根据http://localhost:8080/api/jsonws
中的json规范,
'/user/add-user' Parameters:
companyId long
autoPassword boolean
password1 java.lang.String
password2 java.lang.String
autoScreenName boolean
screenName java.lang.String
emailAddress java.lang.String
facebookId long
openId java.lang.String
locale java.util.Locale
firstName java.lang.String
middleName java.lang.String
lastName java.lang.String
prefixId int
suffixId int
male boolean
birthdayMonth int
birthdayDay int
birthdayYear int
jobTitle java.lang.String
groupIds long[]
organizationIds long[]
roleIds long[]
userGroupIds long[]
sendEmail boolean
serviceContext com.liferay.portal.service.ServiceContext
为了访问网络服务,我使用这些代码(基于Liferay forum):
public void serverConnection(String address, String protocol, int port, String webservicesPath, String loginUser, String password)
this.webservicesPath = webservicesPath;
// Host definition
targetHost = new HttpHost(address, port, protocol);
// Credentials
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(new AuthScope(targetHost.getHostName(), targetHost.getPort()),
new UsernamePasswordCredentials(loginUser, password));
// Client
httpClient = HttpClients.custom().setDefaultCredentialsProvider(credentialsProvider).build();
// Create AuthCache instance
AuthCache authCache = new BasicAuthCache();
// Generate BASIC scheme object and add it to the local auth cache
BasicScheme basicScheme = new BasicScheme();
authCache.put(targetHost, basicScheme);
// Add AuthCache to the execution context
httpContext = new BasicHttpContext();
httpContext.setAttribute(HttpClientContext.AUTH_CACHE, authCache);
创建用于连接和管理身份验证的 Http 客户端,并且:
public String getHttpResponse(String webService, List<NameValuePair> params) throws ClientProtocolException,
IOException, NotConnectedToWebServiceException, AuthenticationRequired
// Set authentication param if defined.
setAuthParam(params);
HttpPost post = new HttpPost("/" + webservicesPath + webService);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params, "UTF-8");
post.setEntity(entity);
HttpResponse response = getHttpClient().execute(targetHost, post, httpContext);
if (response.getEntity() != null)
// A Simple JSON Response Read
String result = EntityUtils.toString(response.getEntity());
if (result.contains("\"exception\":\"Authenticated access required\""))
throw new AuthenticationRequired("Authenticated access required.");
return result;
return null;
调用网络服务并读取响应。然后,为了调用,我执行两个操作:连接和调用 Web 服务。 现在连接很简单:
serverConnection("localhost", "http", 8080, "api/jsonws/", "test@liferay.com", "test");
调用“add-user”网络服务:
public User addUser(Company company, String password, String screenName, String emailAddress, long facebookId,
String openId, String locale, String firstName, String middleName, String lastName, int prefixId,
int sufixId, boolean male, int birthdayDay, int birthdayMonth, int birthdayYear, String jobTitle,
long[] groupIds, long[] organizationIds, long[] roleIds, long[] userGroupIds, boolean sendEmail)
throws NotConnectedToWebServiceException, ClientProtocolException, IOException, AuthenticationRequired, WebServiceAccessError
checkConnection();
boolean autoPassword = false;
boolean autoScreenName = false;
if (password == null || password.length() == 0)
autoPassword = true;
if (screenName == null || screenName.length() == 0)
autoScreenName = true;
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("companyId", Long.toString(company.getCompanyId())));
params.add(new BasicNameValuePair("autoPassword", Boolean.toString(autoPassword)));
params.add(new BasicNameValuePair("password1", password));
params.add(new BasicNameValuePair("password2", password));
params.add(new BasicNameValuePair("autoScreenName", Boolean.toString(autoScreenName)));
params.add(new BasicNameValuePair("screenName", screenName));
params.add(new BasicNameValuePair("emailAddress", emailAddress));
params.add(new BasicNameValuePair("facebookId", Long.toString(facebookId)));
params.add(new BasicNameValuePair("openId", openId));
params.add(new BasicNameValuePair("locale", locale));
params.add(new BasicNameValuePair("firstName", firstName));
params.add(new BasicNameValuePair("middleName", middleName));
params.add(new BasicNameValuePair("lastName", lastName));
params.add(new BasicNameValuePair("prefixId", Integer.toString(prefixId)));
params.add(new BasicNameValuePair("sufixId", Integer.toString(sufixId)));
params.add(new BasicNameValuePair("male", Boolean.toString(male)));
params.add(new BasicNameValuePair("birthdayMonth", Integer.toString(birthdayMonth));
params.add(new BasicNameValuePair("birthdayDay", Integer.toString(birthdayDay)));
params.add(new BasicNameValuePair("birthdayYear", Integer.toString(birthdayYear)));
params.add(new BasicNameValuePair("jobTitle", jobTitle));
params.add(new BasicNameValuePair("groupIds", Arrays.toString(groupIds)));
params.add(new BasicNameValuePair("organizationIds", Arrays.toString(organizationIds)));
params.add(new BasicNameValuePair("roleIds", Arrays.toString(roleIds)));
params.add(new BasicNameValuePair("userGroupIds", Arrays.toString(userGroupIds)));
params.add(new BasicNameValuePair("sendEmail", Boolean.toString(sendEmail)));
params.add(new BasicNameValuePair("serviceContext", ""));
String result = getHttpResponse("user/add-user", params);
User user = null;
if (result != null)
// A Simple JSON Response Read
user = decodeFromJason(result, User.class);
userPool.addUser(user);
LiferayClientLogger.info(this.getClass().getName(), "User '" + user.getScreenName() + "' added.");
return user;
return user;
那叫:
//company is a Liferay company instance with not null value.
addUser(company, "testpass", "testUser", "mail@mail.com", 0, "", "es_ES", "testUser", "testUser", "testUser", 0, 0, true, 1, 1, 1900, "Tailor", null, null, null, null, false);
这基本上创建了所有参数并调用 Web 服务。我认为所有参数都与 Web 服务所期望的完全匹配。那么问题是:
得到的错误是什么意思?尽管参数正确,可能会出现? 如果参数不正确,那是正确的吗?
【问题讨论】:
如果从 Web 界面使用,该 Web 服务工作正常。 我从未尝试过,但您可以将 serviceContext 值提供为 null 感谢您的回答。使用“null”值,观察到相同的错误。错误必须在其他地方。 【参考方案1】:替换这个:
params.add(new BasicNameValuePair("sufixId", Integer.toString(sufixId)));
用这个:
params.add(new BasicNameValuePair("suffixId", Integer.toString(sufixId)));
并删除它:
params.add(new BasicNameValuePair("serviceContext", ""));
【讨论】:
是的,我刚刚测试过,你是对的。我非常专注于服务结构,以至于我无法看到“suffixId”上的错字。感谢您指出!以上是关于Liferay json Web 服务:添加用户不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
Liferay Portal Json Web Service 反序列化漏洞(CVE-2020-79
Liferay Portal Json Web Service 反序列化漏洞(CVE-2020-79