如何只使用读取权限订阅activemq主题?

时间:2013-05-31 07:09:12

标签: activemq

我一直在尝试配置我的activemq服务器,以便匿名客户端可以只订阅主题(他们无法创建或发布到主题)。

我已经在我的代理配置上相应地设置了权限:

<plugins>
    <simpleAuthenticationPlugin anonymousAccessAllowed="true">
        <users>
            <authenticationUser username="system" password="manager"
                groups="anonymous,admins"/>
        </users>
    </simpleAuthenticationPlugin>


  <!--  Lets configure a destination based authorization mechanism -->
  <authorizationPlugin>
    <map>
      <authorizationMap>
        <authorizationEntries>
          <authorizationEntry queue=">" read="admins,anonymous" write="admins" admin="admins" />

          <authorizationEntry topic=">" read="admins,anonymous"  write="admins" admin="admins" />

        </authorizationEntries>
      </authorizationMap>
    </map>
  </authorizationPlugin>

</plugins>

我根据我在网上找到的一些教程使用下面的代码进行订阅。但是,本主题消费者代码以及我发现的所有消息代码都会创建一个要绑定的activemq主题(如果主题已经存在,则为事件),因此只有在我向用户提供管理员权限时才会授权。 .. 有没有办法订阅主题而不创建它?

     ActiveMQSslConnectionFactory connectionFactory = new ActiveMQSslConnectionFactory(connectionString);
     connection = connectionFactory.createConnection();
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
     destination = session.createTopic(topicName);
     MessageConsumer consumer = null;
     consumer = session.createConsumer(destination);
     consumer.setMessageListener(this);
     connection.start();

1 个答案:

答案 0 :(得分:1)

主题必须由某人创建才能被阅读。创建需求的替代方法是通过<destinations>块中的<broker>块创建主题:

<destinations>
    <topic physicalName="someTopic"/>
</destinations>

如果您说“创建要绑定的activemq主题(如果主题已存在则为事件)”,您可能会看到按需创建advisory topics(这是正常的)。您应该将以下内容添加到授权配置中:

<authorizationEntry topic="ActiveMQ.Advisory.>" 
    read="admins" 
    write="admins,anonymous" 
    admin="admins,anonymous" />