【问题标题】:Custom spring-based rest API with Apache Knox gateway使用 Apache Knox 网关自定义基于 spring 的 rest API
【发布时间】:2016-04-27 15:16:43
【问题描述】:

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

【问题讨论】:

    标签: spring hadoop spring-security hortonworks-data-platform


    【解决方案1】:

    让我们从 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>
    

    如果您想非常具体,这将是等效的。这里&lt;rewrite apply=""&gt; 标识 rewrite.xml 中的特定命名规则,&lt;rewrite to=""&gt; 标识应该应用该规则的请求和/或响应的哪一部分。

    <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=**} 成为第二条规则的模式和模板。在&lt;rule pattern=""&gt; 中,这用于为从匹配模式中提取的值命名。在&lt;rewrite template=""&gt; 中,该名称用于使用从匹配模式中提取的命名值填充正在创建的部分 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>
    

    【讨论】:

    • 请注意,名称“path”可以是除“path”之外的任何名称,因为它代表此处 URL 的 contextPath。
    • 只是为了确保“名称” {path=**} 完全清楚...在处理重写规则期间,从传入请求中提取命名变量(在这种情况下URL)并且可用于重写的输出(在本例中为模板)。 "{path=**}" 表示从该位置开始获取所有路径元素(一个或多个)。然后,您可以获取该多元素变量,并根据需要使用它的全部或部分填充重写模板。在这种情况下,我们想要整个路径,因此它使用变量名和代表所有部分的“{=**}”。
    【解决方案2】:

    您需要为 Apache Knox 提供自定义 REST API 的服务定义。这将允许诺克斯:

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

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

    一旦服务定义到位,您只需在 Knox 拓扑中添加一个&lt;service&gt; 元素,以指示实际基于 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 的开发人员或用户电子邮件列表。

    【讨论】:

    • 嘿,Imccay,谢谢上面的链接真的对我有帮助,我会再试一次,谢谢...:)
    • 嘿,我正在尝试扩展 ServiceDeploymentContributorBase 类 如链接 knox.apache.org/books/knox-0-7-0/… 中所述,但我遇到了 UrlRewriteRulesDescriptor newRules = loadRulesFromClassPath(); 的一些问题但是没有名为 loadRulesFromClassPath 的函数定义,也没有关于如何使用重写描述符 API 的文档。另一个问题是下面的函数需要更多的参数,但在示例中没有提及。 addRewriteFilter(上下文,服务,资源); addDispatchFilter(上下文、服务、资源);
    • 我已经联系了开发人员和用户邮件列表,但如果您对此有所了解,请帮助我...实际上没有可用的 java 文档,这让我很困惑,我是 hadoop 新手诺克斯网关
    • 我认为我们需要更好地理解您为什么要扩展 ServiceDeploymentContributorBase。我将您指向该部分的目的是,现在有一种基于配置的方法,这在很大程度上消除了现在创建自己的贡献者的需要。我想知道这种机制是否不能用于您的用例,或者文档是否需要更好地传达基于配置的方法而不是需要代码。
    • 嘿,我这样做是因为我在研究后关注了你提供的链接,我才知道,这种方法在 knox 0.6.0 之前使用并且我使用 0.6.0 但现在我担心的是如何我遵循这个链接去寻找基于配置的方法,但在流动这之后,我的服务也无法正常工作kminder.github.io/knox/2015/11/16/adding-a-service-to-knox.html
    【解决方案3】:

    这些是我的 2 个 xml 文件,如果我有任何错误或我需要做什么,请查看它 **重写.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>
    

    【讨论】:

    • 也许您只是没有复制它,但上面的 rewrite.xml 文件中的规则元素缺少一个开始标记。不过我会继续看的。
    • 此外,service.xml 文件中的第二个路由元素似乎缺少一个结束路由标记。
    • 我很抱歉在原始文件中这两样东西都在那里......这是复制粘贴真的很抱歉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多