授权
为了完成安全迁移,我们需要处理授权策略。在 ActiveMQ 中,授权是使用 conf/activemq.xml 中的适当代理插件指定的,例如
<authorizationPlugin>
  <map>
    <authorizationMap>
      <authorizationEntries>
        <authorizationEntry queue=">" read="admins" write="admins" admin="admins"/>
        <authorizationEntry queue="USERS.>" read="users" write="users" admin="users"/>
        <authorizationEntry queue="GUEST.>" read="guests" write="guests,users" admin="guests,users"/>
        <authorizationEntry topic=">" read="admins" write="admins" admin="admins"/>
        <authorizationEntry topic="USERS.>" read="users" write="users" admin="users"/>
        <authorizationEntry topic="GUEST.>" read="guests" write="guests,users" admin="guests,users"/>
        <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users" write="guests,users" admin="guests,users"/>
      </authorizationEntries>
    </authorizationMap>
  </map>
</authorizationPlugin>
等效的 Artemis 配置在 etc/broker.xml 中指定,应该如下所示
<security-settings>
  <security-setting match="#">
    <permission type="createNonDurableQueue" roles="admins"/>
    <permission type="deleteNonDurableQueue" roles="admins"/>
    <permission type="createDurableQueue" roles="admins"/>
    <permission type="deleteDurableQueue" roles="admins"/>
    <permission type="consume" roles="admins"/>
    <permission type="browse" roles="admins"/>
    <permission type="send" roles="admins"/>
  </security-setting>
  <security-setting match="USERS.#">
    <permission type="createNonDurableQueue" roles="users"/>
    <permission type="deleteNonDurableQueue" roles="users"/>
    <permission type="createDurableQueue" roles="users"/>
    <permission type="deleteDurableQueue" roles="users"/>
    <permission type="consume" roles="users"/>
    <permission type="browse" roles="users"/>
    <permission type="send" roles="users"/>
  </security-setting>         
  <security-setting match="GUESTS.#">
    <permission type="createNonDurableQueue" roles="guests"/>
    <permission type="deleteNonDurableQueue" roles="guests"/>
    <permission type="createDurableQueue" roles="guests"/>
    <permission type="deleteDurableQueue" roles="guests"/>
    <permission type="consume" roles="guests"/>
    <permission type="browse" roles="guests"/>
    <permission type="send" roles="guests"/>
  </security-setting>                  
</security-settings>
如您所见,它们非常相似,只是有一些细微的差别。最重要的是,ActiveMQ 中的策略是在目标名称上定义的,而在 Artemis 中它们应用于核心队列(回顾之前部分和 Artemis 用户手册中队列和地址之间的关系)。
另一个值得注意的差异是,Artemis 中的策略更加细粒度。以下段落和表格显示了与 ActiveMQ 策略相对应的 Artemis 策略。
如果您希望允许用户发送消息,您需要在各自的代理中定义以下策略。
| ActiveMQ | Artemis | 
|---|---|
| write | send | 
在 Artemis 中,用于消费和浏览的策略是分开的,您需要同时定义它们来控制对目标的read访问权限。
| ActiveMQ | Artemis | 
|---|---|
| read | consume | 
| browse | 
admin权限也是一样的。您需要为持久和非持久核心队列定义单独的创建和删除策略。
| ActiveMQ | Artemis | 
|---|---|
| admin | createNonDurableQueue | 
| deleteNonDurableQueue | |
| createDurableQueue | |
| deleteDurableQueue | 
最后,还有一个使用通配符定义策略的问题。下表显示了通配符语法的差异。
| 通配符 | 描述 | ActiveMQ | Artemis | 
|---|---|---|---|
| 分隔符 | 在路径中分隔单词 | . | . | 
| 单个单词 | 匹配路径中的单个单词 | * | * | 
| 任何单词 | 递归地匹配路径中的任何单词 | > | # | 
基本上,默认情况下只有任何单词字符不同,这就是为什么我们在 Artemis 示例中使用GUESTS.#而不是 ActiveMQ 的GUESTS.>语法的原因。
掌握了这些知识,您应该能够将当前的 ActiveMQ 授权策略转换为 Artemis。