限定 Pub/Sub 主题访问权限

使用范围(scopes)限制 Pub/Sub 主题到特定的应用程序

介绍

名称空间或组件作用域(scopes) 可用于限制对特定应用程序的组件访问。 添加到组件的这些应用程序作用域仅限制具有特定 ID 的应用程序才能使用该组件。

除了此常规组件范围外,对于 pub/sub 组件,还可以限制以下操作:

  • 哪些主题可以使用(发布或订阅)
  • 哪些应用程序被允许发布到特定主题
  • 哪些应用程序被允许订阅特定主题

这称为 pub/sub 主题作用域限定

为每个 pub/sub 组件定义发布/订阅范围。 您可能有一个名为 pubsub 的 pub/sub 组件,它有一组范围设置,另一个 pubsub2 另有一组范围设置。

要使用这个主题范围,可以设置一个 pub/sub 组件的三个元数据属性:

  • spec.metadata.publishingScopes
    • 分号分隔应用程序列表& 逗号分隔的主题列表允许该 app 发布信息到主题列表
    • 如果在 publishingScopes (缺省行为) 中未指定任何内容,那么所有应用程序可以发布到所有主题
    • 要拒绝应用程序发布信息到任何主题,请将主题列表留空 (app1=;app2=topic2)
    • 例如, app1=topic1;app2=topic2,topic3;app3= 允许 app1 发布信息至 topic1 ,app2 允许发布信息到 topic2 和 topic3 ,app3 不允许发布信息到任何主题。
  • spec.metadata.subscriptionScopes
    • 分号分隔应用程序列表& 逗号分隔的主题列表允许该 app 订阅主题列表
    • 如果在 subscriptionScopes (缺省行为) 中未指定任何内容,那么所有应用程序都可以订阅所有主题
    • 例如, app1=topic1;app2=topic2,topic3 允许 app1 订阅 topic1 ,app2 可以订阅 topic2 和 topic3
  • spec.metadata.allowedTopics
    • 一个逗号分隔的允许主题列表,对所有应用程序。
    • 如果未设置 allowedTopics (缺省行为) ,那么所有主题都有效。 subscriptionScopespublishingScopes 如果存在则仍然生效。
    • publishingScopessubscriptionScopes 可用于与 allowedTopics 的 conjuction ,以添加限制粒度

这些元数据属性可用于所有 pub/sub 组件。 以下示例使用 Redis 作为 pub/sub 组件。

示例 1: 限制主题访问权限

如果主题包含敏感信息,并且只允许应用程序的某个子集发布或订阅这些主题,限制哪些应用程序可以发布/订阅主题可能很有用。

它还可以用于所有主题,以始终具有应用程序使用哪些主题作为发布者/订阅者的“基本事实”。

以下是三个应用程序和三个主题的示例:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: pubsub
  5. namespace: default
  6. spec:
  7. type: pubsub.redis
  8. version: v1
  9. metadata:
  10. - name: redisHost
  11. value: "localhost:6379"
  12. - name: redisPassword
  13. value: ""
  14. - name: publishingScopes
  15. value: "app1=topic1;app2=topic2,topic3;app3="
  16. - name: subscriptionScopes
  17. value: "app2=;app3=topic1"

下表显示哪些应用程序允许在主题中发布:

topic1topic2topic3
app1X
app2XX
app3

下表显示哪些应用程序可以订阅主题:

topic1topic2topic3
app1XXX
app2
app3X

注意: 如果应用程序未列出 ( 例如, subscriptionScopes 中的 app1) ,那么允许订阅所有主题。 因为 allowedTopics 未使用,而 app1 任何订阅范围,因此它还可以使用上面未列出的其他主题。

示例 2: 限制允许的主题

当 Dapr 应用程序给主题发送信息时,主题将自动创建。 在某些情况下,这个主题的创建应该得到管理。 例如:

  • Dapr 应用程序中有关生成主题名称的错误可能会导致创建无限数量的主题
  • 简化主题名称和总数,防止主题无限增长

在这些情况下,可以使用 allowedTopics

以下是三个允许的主题的示例:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: pubsub
  5. namespace: default
  6. spec:
  7. type: pubsub.redis
  8. version: v1
  9. metadata:
  10. - name: redisHost
  11. value: "localhost:6379"
  12. - name: redisPassword
  13. value: ""
  14. - name: allowedTopics
  15. value: "topic1,topic2,topic3"

所有应用程序都可以使用这些主题,但仅允许这些主题,不允许其他主题。

示例 3: 组合 allowedTopics 和范围

有时,您希望合并这两个作用域,从而仅具有固定的一组允许主题,并指定对某些应用程序的作用域限定。

以下是三个应用程序和两个主题的示例:

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: pubsub
  5. namespace: default
  6. spec:
  7. type: pubsub.redis
  8. version: v1
  9. metadata:
  10. - name: redisHost
  11. value: "localhost:6379"
  12. - name: redisPassword
  13. value: ""
  14. - name: allowedTopics
  15. value: "A,B"
  16. - name: publishingScopes
  17. value: "app1=A"
  18. - name: subscriptionScopes
  19. value: "app1=;app2=A"

注意: 第三个应用程序未列出,因为如果在作用域内未指定应用程序,那么允许使用所有主题。

下表显示允许哪些应用程序发布到主题中:

ABC
app1X
app2XX
app3XX

下表显示哪些应用程序允许订阅主题:

ABC
app1
app2X
app3XX

例子

相关链接