2013-05-31 3 views
0

Я пытался настроить свой сервер 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

Тема должна быть создана кем-то для того, чтобы читать. Альтернатива создания спроса, чтобы создать тему с помощью <destinations> блока в <broker> блока:

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

Когда вы говорите, «создает ActiveMQ тему связывать (событие, если тема уже существует)» Вы могли бы быть вид advisory topics создается по требованию (что нормально). Вы должны добавить следующее к авторизации конфигурации:

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

Что я имею в виду существующие тема является темой, которая была ранее создана уполномоченным клиентом Java (с правами администратора), и в моем случае, с сообщениями публикуются к нему. А затем, подписчик, чтобы подключиться к той теме, которая уже существует и подписаться на нее. Проблема в том, что я мог бы только подписаться на эту существующую тему на Java, сначала позвонив по адресу 'destination = session.createTopic (topicName);' и для того, чтобы это сделать, я должен предоставить права администратора этому пользователю, в то время как Id, только что прочитали права – Thomas

+1

В действительности метод createTopic не создает никаких связей с Брокером, поэтому вы можете называть его кодом клиента, даже если он имеет доступ только для чтения. Вещи потерпели бы неудачу только тогда, когда клиент затем отправился подписываться или выдавать в пункт назначения, которого не существует, и в этом случае будет выбрано исключение. Вы должны думать о createTopic и createQueue только как о местных методах фабрики для возвращаемых объектов. –

Смежные вопросы