1

我设法在 Knox 中配置了一个 websocket 服务,用于测试目的是ws://echo.websocket.org

这是我的配置文件:

服务.xml

<service role="ECHOWS" name="echows" version="0.0.1">
  <policies>
        <policy role="webappsec"/>
        <policy role="authentication" name="Anonymous"/>
        <policy role="rewrite"/>
        <policy role="authorization"/>
  </policies>
  <routes>
    <route path="/echows">
        <rewrite apply="ECHOWS/echows/inbound" to="request.url"/>
    </route>
  </routes>
</service>

重写.xml

<rules>
  <rule dir="IN" name="ECHOWS/echows/inbound" pattern="*://*:*/**/echows">
    <rewrite template="{$serviceUrl[ECHOWS]}"/>
  </rule>
</rules>

{拓扑}.xml部分:

<service>
    <role>ECHOWS</role>
    <url>ws://echo.websocket.org</url>
</service>

我可以连接到它:

wscat -c wss://my-knox-server/gateway/default/echows
connected (press CTRL+C to quit)
> Hello Knox!
< Hello Knox!

但我希望 Knox 仅在提供正确凭据时才接受连接:

wscat --auth <username:password> -c wss://my-knox-server/gateway/default/echows

我的 http 服务的 Knox 配置以这种方式工作,我必须输入凭据,否则我会得到 401:

curl -i https://my-knox-server/gateway/default/my_service/ping
HTTP/1.1 401 Unauthorized

curl -i -u '<user>:<password>' https://my-knox-server/gateway/default/my_service/ping
HTTP/1.1 200 OK

我想用 websockets 达到同样的效果。

[编辑]

此外,我并不完全理解我的 websocket 服务的上述service.xml配置,因为它与我能够使用的 http 服务的最简单配置不同:

<service role="MY_APP" name="my_app" version="0.0.1">
    <routes>
        <route path="/my_app/**"/>
    </routes>
</service>
  1. 为什么在我需要 websocket 服务的情况下,policies它们是什么意思?
  2. 为什么<routes>/<route>有一个元素<rewrite>,它的语义是什么?它是否对应<rule>/<rewrite>rewrite.xml?那里是什么request.url意思?
4

1 回答 1

1

好问题,不幸的是,Knox 中的身份验证和授权机制基于 Http servlet 过滤器,不适用于 Websocket。

您可以做的一件事是让 HTTP 端进行身份验证,然后打开 websocket 连接。

如果您愿意,您可以为此增强功能打开一个JIRA 。

[编辑]

后续问题的答案

  1. 如果 Websockets 没有意义,它们是来自 http 的工件
  2. 与使用 websocket 相比,使用 http 上下文可以更好地解释 in 重写。他们所做的是,告诉 Knox 何时应用重写规则,即 request.url、request.body、response.url、response.body 等。由于规则基于 HTTP servlet 过滤器,因此它们不用于重写 websocket 数据。我相信应该有一些 JIRA 来解决这个问题。
于 2017-10-05T19:28:47.350 回答