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 使用 API/Web 服务登录

Liferay Portal Json Web Service 反序列化漏洞(CVE-2020-79

Liferay Portal Json Web Service 反序列化漏洞(CVE-2020-79

试图找到用户在 liferay 6.2 中拥有的所有权限并返回一个 JSON 对象

如何在 Liferay DXP 中添加语言图标

Liferay 7 资产发布者新的网页内容文件夹