使用 Apache Knox 网关自定义基于 spring 的休息 API

Custom spring-based rest API with Apache Knox gateway

我正在尝试做一个 POC,其中我需要通过 Apache Knox 保护我的集群,而我自己开发的其余部分 API 将位于 Knox 后面。用户身份验证应如何与 Knox Ranger 配合使用,我将如何保护我的数据访问?

您需要向 Apache Knox 提供自定义 REST API 的服务定义。这将使 Knox 能够:

  1. 识别 API 对基于 spring 的服务的传入请求的 URL,并能够将请求路由到它
  2. 了解如何重写响应中的特定内容,例如 URL 或其他敏感内容,以便在适当时通过网关将客户端重定向回。

请参阅:http://knox.apache.org/books/knox-0-7-0/dev-guide.html#Service+Definition+Files 开发人员指南,了解如何提供服务定义。

服务定义就位后,您只需在 Knox 拓扑中添加一个 <service> 元素,以指示基于 spring 的实际服务所在的位置 运行。应该是这样的:

<service>
    <role>SERVICE</role>
    <url>http://url.to.your.service/v1/...</url>
</service>

开发人员指南的同一部分也对此进行了描述。 您可能还会发现用户指南对于拓扑中服务声明的其他示例很有帮助。

您可以查看这些示例并将它们与那些现有服务的服务定义文件进行比较,以了解服务角色如何映射。这将帮助您为自己的服务做同样的事情。

有关身份验证的详细信息,请参阅用户指南中的 http://knox.apache.org/books/knox-0-7-0/user-guide.html#Authentication,了解有关设置基于 LDAP 的身份验证的说明。您可能还对其他身份验证和联合提供程序实现感兴趣。您也可以在用户指南中找到它们。

也欢迎与 Apache Knox 的开发人员或用户电子邮件列表联系。

这些是我的 2 xml 文件,如果我有任何错误或者我还需要做什么,请查看它 **rewrite.xml

        <rule dir="IN" name="TEST_WEB_APP/Test_Web_App" pattern="*://*:*/**/Test_Web_App/?{**}">
            <rewrite template="{$serviceUrl[TEST_WEB_APP]}/?{**}"/>
        </rule>

        <rule dir="IN" name="TEST_WEB_APP/Test_Web_App/query" pattern="*://*:*/**/Test_Web_App/{**}?{**}">
            <rewrite template="{$serviceUrl[TEST_WEB_APP]/{**}?{**}"/>
        </rule>
         </rules>
**service.xml
<service role="TEST_WEB_APP" name="Test_Web_App" version="0.0.1">
    <routes>
        <route path="/Test_Web_App/**">
            <rewrite apply="TEST_WEB_APP/Test_Web_App/**" to="response.body" />
        </route>
        <route path="/Test_Web_App/**?**">
           <rewrite apply="TEST_WEB_APP/Test_Web_App/**?**" to="response.body"/>
    </routes>
</service>

让我们从 service.xml 文件开始。它应该看起来像下面的更简单的版本。如果您需要将特定规则应用于请求或响应的特定部分,则只需要更复杂的表单。请注意,理想情况下只需要一条路线,但 Knox 中的 ** 表示一个或多个路径级别(不是零个或多个)。因此,如果没有第一条路线,Knox 将不会向服务的根 /Test_Web_App 路径发送请求。

<service role="TEST_WEB_APP" name="Test_Web_App" version="0.0.1">
    <routes>
        <route path="/Test_Web_App/?**">
        <route path="/Test_Web_App/**?**">
    </routes>
</service>

如果您想对其进行非常具体的说明,这将是等效的。这里的 <rewrite apply=""> 标识了 rewrite.xml 中的特定命名规则,而 <rewrite to=""> 标识了规则应应用于请求和/或响应的哪一部分。

<service role="TEST_WEB_APP" name="Test_Web_App" version="0.0.1">
    <routes>
        <route path="/Test_Web_App/?**">
          <rewrite apply="TEST_WEB_APP/Test_Web_App" to="request.url"/>
        </route>
        <route path="/Test_Web_App/**?**">
          <rewrite apply="TEST_WEB_APP/Test_Web_App/query" to="request.url"/>
        </route>
    </routes>
</service>

现在 rewrite.xml。你的非常接近。我添加的只是一个名称(即路径),导致第二条规则的模式和模板都为 {path=**}。在 <rule pattern=""> 中,这用于为从匹配模式中提取的值命名。在 <rewrite template=""> 中,该名称用于填充正在创建的 URL 的一部分,其中使用从匹配模式中提取的命名值。

<rules>
    <rule dir="IN" name="TEST_WEB_APP/Test_Web_App" pattern="*://*:*/**/Test_Web_App/?{**}">
        <rewrite template="{$serviceUrl[TEST_WEB_APP]}/?{**}"/>
    </rule>

    <rule dir="IN" name="TEST_WEB_APP/Test_Web_App/query" pattern="*://*:*/**/Test_Web_App/{path=**}?{**}">
        <rewrite template="{$serviceUrl[TEST_WEB_APP]/{path=**}?{**}"/>
    </rule>
</rules>