在尝试设置一种良好且自动的方式来配置 ActiveMQ Artemis 用户时,我偶然发现了可以在 security-settings
块中使用的wildcard 路由。
利用这一点将使应用程序间的通信变得容易。从
appA
到 appB
发送某些内容始终可以通过使用固定队列模式来完成:appA.appB.requestSomething
将指示从 appA
到包含 appB
的requestSomething
的通信。使用 requestSomethingElse
等创建队列是很简单的。
反转也是可能的,只需翻转图案即可:
appB.appA.responseSomething
等
给出以下
security-settings
块:
<security-setting match="appA.#">
<permission type="createDurableQueue" roles="appA"/>
<permission type="deleteDurableQueue" roles="appA"/>
<permission type="createAddress" roles="appA"/>
<permission type="deleteAddress" roles="appA"/>
<permission type="consume" roles="appA"/>
<permission type="browse" roles="appA"/>
<permission type="send" roles="appA"/>
<permission type="manage" roles="appA"/>
</security-setting>
<security-setting match="*.appA.#">
<permission type="consume" roles="appA"/>
<permission type="browse" roles="appA"/>
</security-setting>
<security-setting match="appB.#">
<permission type="createDurableQueue" roles="appB"/>
<permission type="deleteDurableQueue" roles="appB"/>
<permission type="createAddress" roles="appB"/>
<permission type="deleteAddress" roles="appB"/>
<permission type="consume" roles="appB"/>
<permission type="browse" roles="appB"/>
<permission type="send" roles="appB"/>
<permission type="manage" roles="appB"/>
</security-setting>
<security-setting match="*.appB.#">
<permission type="consume" roles="appB"/>
<permission type="browse" roles="appB"/>
</security-setting>
并使用
appA
配置生产者发送到 appA.appB.request
会引发以下异常:Cause: AMQ229213: User: appA does not have permission='CREATE_DURABLE_QUEUE' for queue appA.appB.request on address appA.appB.request
。
描述
security-settings
读取权限的 appB
块是否推翻了所有先前描述的设置?
这是无证行为吗?我是否误解了这个机制应该如何运作? 看起来是配置不同应用程序之间通信的好方法..
您所看到的实际上是预期的行为。当客户端应用程序尝试向
appA.appB.request
发送消息时,代理会在内部安全设置存储库中查找 appA.appB.request
并找到此匹配项:
<security-setting match="*.appB.#">
<permission type="consume" roles="appB"/>
<permission type="browse" roles="appB"/>
</security-setting>
这仅允许具有
appB
角色的用户从匹配地址上消费或浏览队列。由于您的用户有 appA
,授权被拒绝。
请记住,如文档所述:
请注意,设置不会从前一个块继承。所有设置都将从更具体的匹配块中获取..
通过不继承权限,它允许您通过简单地不指定权限来有效地拒绝更具体的
块中的权限。否则,将无法拒绝地址子组中的权限。security-setting