3

我目前正在尝试通过 Crossbar/Autobahn 使用 Websockets 实现用户通知系统。我已经完成了多项测试并浏览了文档,但是,我不确定是否有解决方案可以让以下工作流程工作:

  1. 用户使用 Web 应用程序登录——这是通过 JWT 完成的
  2. crossbar前端与正在运行的实例建立 websocket 连接。
  3. 前端尝试订阅专门用于用户通知的 URI:即com.example.notifications.user.23com.example.user.23.notifications'. Where23` 是用户 ID。
  4. 检查用户的 JWT 以查看是否允许用户访问订阅。
  5. 当活动生成并引起通知时,后端会发布用户特定的 URI。

对于第 3 步,我无法判断当前的支持身份验证方法是否满足我的需要。理想情况下,我想要一个可以自定义的身份验证方法(以便在 Crossbar 中实现 JWT 身份验证器),我可以将其应用于 URI 模式,但不能将整个模式的访问权限授予订阅用户。这部分通过动态身份验证方法解决,但缺少后半部分:

例如(我理想的工作流程):

  1. 用户尝试订阅 URI com.example.user.23.notifications
  2. URI 匹配com.example.user..notificationshttp://crossbar.io/docs/Pattern-Based-Subscriptions/中的通配符模式)
  3. 验证令牌已验证,并且用户只能 com.example.user.23.notifications访问.

以上是否可以通过简单的方式实现?据我所知,只有当我以某种方式生成一个.crossbar/config.json包含所有用户 ID 的 URI 排列的...并为每个新用户自动生成一个新配置时才有可能——这完全不是一个合理的解决方案。

任何帮助表示赞赏!

4

1 回答 1

3

使用授权人。

http://crossbar.io/docs/Authorization/#dynamic-authorization

为加入/认证时分配会话的用户角色注册一个动态授权者:

           {
              "name": "authorizer",
              "permissions": [
                {
                  "uri": "com.example.authorize",
                  "register": true
                }
              ]
            },
            {
              "name": "authenticator",
              "permissions": [
                {
                  "uri": "com.example.authenticate",
                  "register": true
                }
              ]
            },
            {
              "name": "user",
              "authorizer": "com.example.authorize"
            },
...
"components": [
    {
      "type": "class",
      "classname": "example.AuthenticatorSession",
      "realm": "realm1",
      "role": "authenticator",
      "extra": {
        "backend_base_url": "http://localhost:8080/ws"
      }
    },
    {
      "type": "class",
      "classname": "example.AuthorizerSession",
      "realm": "realm1",
      "role": "authorizer"
    }
  ]

写一堂课

class AuthorizerSession(ApplicationSession):
    @inlineCallbacks
    def onJoin(self, details):
        print("In AuthorizerSession.onJoin({})".format(details))
        try:
            yield self.register(self.authorize, 'com.example.authorize')
            print("AuthorizerSession: authorizer registered")
        except Exception as e:
            print("AuthorizerSession: failed to register authorizer procedure ({})".format(e))

    def authorize(self, session, uri, action):
        print("AuthorizerSession.authorize({}, {}, {})".format(session, uri, action))
        if session['authrole'] == u'backend':  # backnend can do whatever
            return True
        [Authorization logic here]
        return authorized
于 2016-02-25T20:52:46.640 回答