连接到 ActiveMQ 目标时通过身份验证创建安全级别

Create a security level through authentification when connecting to a ActiveMQ destination

我使用 Apache Activemq 版本 5.14.4 将一些消息发送到队列中并读取它们。我想实现一个安全级别,以便在我连接到目的地时被要求提供用户名和密码。

阅读 ActiveMQ security and looking at a lot of examples including these: example1, example2 的官方文档,我选择使用 Simple Authentication Plugin 来实现。

因此,在我的 activemq.xml 中,我在代理元素中编写了插件:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">

    <simpleAuthenticationPlugin>
        <users>
            <authenticationUser username="Admin01" password="anything" groups="users,admins"/>
        </users>
    </simpleAuthenticationPlugin>


    <authorizationPlugin>
        <map>
            <authorizationMap>
                <authorizationEntries>
                    <authorizationEntry queue=">" write="producers" read="consumers" admin="admins" />  
                    <authorizationEntry topic="ActiveMQ.Advisory.>" admin="admins" />                       
                </authorizationEntries>
            </authorizationMap>
        </map>
    </authorizationPlugin>
 ...
</broker>

这样做时,我预计会被询问用户名和密码,以便连接到目标以使用队列中的消息。

我这样创建连接和目的地:

String username = "Admin01";
String password = "anithing"
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
factory.setTrustedPackages(Arrays.asList("myClass.package_name"));
Connection connection = null;
Session session = null;
Destination destination = null;
    try {
        connection = factory.createConnection(username, password);
        connection.start();
        session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        destination = session.createQueue("myQueue");
...

ActiveMQ 代理已创建,当我要发送的事件发生时,它们将发送到 myQueue。 (我还尝试使用 factory.setPassword() 和 factory.setUserName() 将任何用户名和密码设置为工厂,或仅将用户名和密码设置为连接,或两者都设置,并且当我没有抛出异常不要设置任何用户名和密码)。

好吧,如果我想使用队列中的消息,我有意不设置任何密码并且没有抛出异常并且消息被使用。 (我预计会抛出一个异常,要求输入用户名和密码。我也尝试使用错误的用户名和密码)。

    private void consumeMessage() {
        String userName = "Admin01";
        String password = "anything";
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
//      factory.setUserName(userName);
//      factory.setPassword(password);
        factory.setTrustAllPackages(true);
        Destination destination = null;
        try {
            connection = factory.createConnection();
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            destination = session.createQueue("myQueue");
            consumer = session.createConsumer(destination);
            consumer.setMessageListener(this);
            connection.start();
        }catch(JMSException e) {
            e.printStackTrace();
        } 
    }

我已经覆盖了 credentials.properties 文件: 默认值:

activemq.username=system
activemq.password=manager
guest.password=password

已覆盖:

activemq.username=Admin01
activemq.password=anything

我还覆盖了文件: groups.properties 文件到 admins=Admin01 和 users.properties 到 admin=Admin01,但仍然没有询问密码。

以上所有文件都在\apache-activemq-5.14.4\conf目录下。

我能做些什么来在 ActiveMQ 上实现这个安全级别,以便当我想连接到目的地以便使用来自 "myQueue" 的消息时被要求提供用户名和密码?

默认 <simpleAuthenticationPlugin anonymousAccessAllowed="false"> 拒绝匿名访问。