主题安全性
客户机应用程序发布和预订主题。启用消息传递安全性时,客户机应用程序需要访问主题的权限。
主题包含在主题空间中,主题空间是一种目标类型。在主题空间中,根据主题名称将主题组织成一个或多个主题层次结构。主题层次结构连接至创建主题空间时创建的虚拟根。主题是客户机应用程序发布至主题时在主题空间中创建的。
连接访问主题时,会执行访问检查以确保与该连接相关联的用户有权访问包含该主题的主题空间目标。系统会执行另一检查以确保用户在主题空间目标拥有的主题层次结构内对主题本身也具有访问权。这允许更细粒度地控制对主题的访问,如本节稍后部分的图中所示。该图显示包含两个主题层次结构(sports 和 cars)的主题空间 tspace1。

每个总线可包含多个主题空间。每个主题空间独立于总线上的其他主题空间。不同主题空间中的主题彼此无关,即使它们同名也是如此。例如,考虑包含两个主题空间(tspace1 和 tspace2)的总线,每个主题空间包含名为 cars 的主题。如果客户机应用程序预订 tspace1 中的 cars,那么它只能接收发布至 tspace1 中的 cars 主题的消息。
基于角色的授权和主题继承
主题安全性以基于角色的授权为基础。有关更多信息,请参阅基于角色的授权。为更加轻松地管理大量主题的安全性权限,对主题定义的访问角色应包含对主题本身及(缺省情况下)主题层次结构中在它之下的任何主题的访问权限。因此主题从其父主题继承角色。因此,缺省情况下对虚拟根定义的访问角色包含对主题空间中每个主题的访问权限。在上面给出的示例中,对主题空间 tspace1 的虚拟根定义了发送方和接收方角色。
- 主题 sports、cricket 和 cars 继承对虚拟根定义的发送方角色,但主题 tennis 的发送方角色继承被禁用。这意味着主题 tennis 及其子代不能从虚拟根继承发送方角色。对主题 tennis 本身定义了发送方角色。消息传递引擎检查连接客户机应用程序对主题 tennis 及其子代是否具有发送方角色中的权限。
- 层次结构中的每个主题都从虚拟根继承接收方角色。sports 主题也具有单独的接收方角色。消息传递引擎对存在其他访问角色的位置执行其他检查。主题 sports 的子代从父主题和虚拟根继承接收方角色。主题 lawn 也具有单独的接收方角色。
可在运行时创建主题之前对该主题定义访问角色。请注意,除非您显式禁用主题继承,否则该主题可从其父代继承角色。
预订权限
客户机应用程序为所选主题创建预订时,消息传递引擎会检查客户机是否具有接收发布至所选主题的消息的接收方角色中的权限。预订可针对单个主题,也可通过使用主题规范中的通配符来针对多个主题。在任一情况下,预订的消息到达时,消息传递引擎会检查客户机应用程序是否具有所选主题的接收方角色中的权限。客户机应用程序为单个主题创建预订时,消息传递引擎会检查客户机是否具有用于创建预订的创建者角色中的权限。
非持久预订在订户会话持续时间期间存在。这意味着订户会话结束时,预订不再存在。持久预订在订户会话结束后继续存在。这意味着订户未连接至总线时预订继续收集有关主题的消息。订户可重新启动预订并收集消息。只有创建持久预订的客户机应用程序才能重新启动预订。这允许消息传递引擎检查预订处于不活动状态时对针对该主题收集的消息的访问权限。