ActiveMQ Artemis 通配符安全设置未按预期运行

问题描述 投票:0回答:1

在尝试设置一种良好且自动的方式来配置 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
块是否推翻了所有先前描述的设置?

这是无证行为吗?我是否误解了这个机制应该如何运作? 看起来是配置不同应用程序之间通信的好方法..

spring configuration jms message-queue activemq-artemis
1个回答
0
投票

您所看到的实际上是预期的行为。当客户端应用程序尝试向

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
块中的权限。否则,将无法拒绝地址子组中的权限。

© www.soinside.com 2019 - 2024. All rights reserved.