4

我正在使用 Maximo 7.5 REST API 并想用 java 编写 REST 客户端来使用这个 RESTful 服务。我在 Maximo 7.5 端启用了 Maximo 安全性,以使 Maximo 用户能够访问其自己的 REST 服务。下面是我的 Maximo RESTful 服务的 web.xml 的样子。

<security-constraint>
        <web-resource-collection>
            <web-resource-name>REST Servlet for Web App</web-resource-name>
            <description>Object Structure Service Servlet (HTTP POST) accessible by authorized users</description>
            <url-pattern>/rest/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <description>Roles that have access to Object Structure Service Servlet (HTTP POST)</description>
            <role-name>maximouser</role-name>
        </auth-constraint>
        <user-data-constraint>
            <description>data transmission gaurantee</description>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>


    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>REST Web Application Realm</realm-name>        
    </login-config>

我可以使用 Chrome 的 Postman 插件成功查询 Maximo REST 服务。下面 2 是我的邮递员(REST 客户端)标题。1. MAXAUTH - bWF4YWRtaW46bWF4YWRtaW4= 2. 接受 - 应用程序/xml

虽然我已经在标头中给出了授权(MAXAUTH),但我习惯于弹出窗口输入用户名和密码来查询 Maximo REST 服务。提供凭据后,我会收到响应(如下所示) 在此处输入图像描述

下面是我使用相同 RESTful 服务的 Java 代码。我不断收到 401 错误,虽然我将凭据作为财产提供,但它没有授权。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class RESTConsume {

    // http://localhost:8080/RESTfulExample/json/product/get
    public static void main(String[] args) {

        try {

            URL url = new URL("HOSTNAME/maxrest/rest/os/mxperson?personid=maxadmin");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Accept", "Application/xml");
            connection.setRequestProperty("MAXAUTH", "bWF4YWRtaW46bWF4YWRtaW4=");
            System.out.println("Output from Server ....1 \n");

            /*
             * if (conn.getResponseCode() != 200) {
             * System.out.println("Output from Server ....2 \n");
             * 
             * throw new RuntimeException("Failed : HTTP error code : "+
             * conn.getResponseCode()); }
             */
            System.out.println("Output from Server ....3 \n");

            BufferedReader br = new BufferedReader(new InputStreamReader(
                    (connection.getInputStream())));
            System.out.println("Output from Server ....4 \n");

            String output;
            System.out.println("Output from Server .... \n");
            while ((output = br.readLine()) != null) {
                System.out.println(output);
            }

        } catch (MalformedURLException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

下面是我的输出:

Output from Server ....1 

Output from Server ....3 

java.io.IOException: Server returned HTTP response code: 401 for URL: http://vhost0043.dc1.co.us.compute.ihost.com/maxrest/rest/os/mxperson?personid=maxadmin
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at RESTConsume.main(RESTConsume.java:35)

它适用于不同的 RESTful 服务(不是 Maximo RESTful 服务),并且未启用我们没有任何安全性的预期响应。如果我需要做一些额外的事情来使用 Maximo RESTful 服务,请告诉我。

4

4 回答 4

1

如果 user:password 是您的用户名和密码,则 encode64 "user:password"(例如使用此工具:https ://www.base64encode.org/ )。然后,如果“imimastrangestring”是 encode64 的输出,请将其设置为请求属性“MAXAUTH”: connection.setRequestProperty("MAXAUTH", "iamastrangestring");

于 2015-01-22T22:19:10.870 回答
0

您需要使用基本 http 添加用户名和密码参数:

.../os/mxperson?_lid=username&_lpwd=password&_format=xml&personid=MAXADMIN

我认为您只能在使用 LDAP 时使用 AUTH 标头。

于 2014-08-12T10:02:27.143 回答
0

服务需要用户名和密码,或者 maxauth 无效,因此在浏览器的情况下,它会提示您明确输入,但在 maximo 的情况下,您会收到 401。请尝试在请求中提供用户名和密码标题。

于 2014-01-06T08:16:49.700 回答
0

在这里挖掘一个老问题,但是当“我”遇到同样的问题时,我被引导到谷歌的这个答案,所以也许这对其他人有帮助。

我正在查看这篇 IBM 文章:https ://www.ibm.com/support/knowledgecenter/en/SSLKT6_7.6.0/com.ibm.mif.doc/gp_intfrmwk/rest_api/c_rest_security.html 在其中,它列出了两个不同的身份验证选项。现在对我来说似乎很明显,但是文章第一部分建议更改的 XML 块(并且您在帖子中显示为已更改)打开了HTTP Basic Authentication。如果没有这些设置,您需要使用本机身份验证。这让我有点意识到,这似乎也是你困惑的根源。

这意味着,使用标准 Maximo 设置,它被配置为使用本机身份验证。您需要为 MAXAUTH 标头属性提供值为“ <username>:<password>” base64 编码的值。Maximo 将对其进行解码并获取用户名和密码,并将它们与内部数据库进行比较。如果它们匹配,则认为请求已通过身份验证,服务将返回其结果。如果它们不匹配,您将被视为未经身份验证,并且您会收到 401 错误。这意味着Maximo正在对其数据库进行身份验证。

如果您更改链接文章中描述的设置,并且正如您在问题中所做并显示的那样,那么您就是说您不想使用该表单身份验证(我假设它实际上关闭了该身份验证形式)。然后您说您希望应用程序服务器应用程序服务器的“数据库”而不是Maximo 的进行身份验证。如果您想针对 LDAP (Active Directory) 或类似的东西进行验证,这就是您想要的。

在这种情况下,需要使用 HTTP 基本身份验证标准来发送用户名和密码。请参阅:https : //en.wikipedia.org/wiki/Basic_access_authentication 这意味着您需要提供一个名为“Authorization”而不是“MAXAUTH”的标头,并且该标头的值必须是字符串“Basic”(注意大写和空格)加上base64编码的字符串“<username>:<password>取决于已部署应用程序的应用服务器设置(这将进入不同的 LDAP 配置讨论,我不想在这里切入;这已经太长了)。然后将该角色传递给 Maximo 以获取请求。Maximo 承担该角色并检查它是否与在其 XML 配置中配置的内容相匹配(您在问题中引用了该角色,并且在之前链接的 IBM 文章中显示了该角色)。如果它们不匹配,我认为您被认为是未经授权的,并且会发回错误。如果它们匹配,则该请求被认为是授权的,被允许通过并且服务返回其响应。Maximo 承担该角色并检查它是否与在其 XML 配置中配置的内容相匹配(您在问题中引用了该角色,并且在之前链接的 IBM 文章中显示了该角色)。如果它们不匹配,我认为您被认为是未经授权的,并且会发回错误。如果它们匹配,则该请求被认为是授权的,被允许通过并且服务返回其响应。Maximo 承担该角色并检查它是否与在其 XML 配置中配置的内容相匹配(您在问题中引用了该角色,并且在之前链接的 IBM 文章中显示了该角色)。如果它们不匹配,我认为您被认为是未经授权的,并且会发回错误。如果它们匹配,则该请求被认为是授权的,被允许通过并且服务返回其响应。

于 2018-04-23T20:16:29.653 回答