Я использую Apache Activemq версии 5.14.4 для отправки некоторых сообщений в очередь и их чтения. Я хочу реализовать уровень безопасности, чтобы при подключении к месту назначения меня попросили указать имя пользователя и пароль.
Прочтите официальную документацию по безопасности ActiveMQ и просмотрите множество примеров, включая следующие: 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();
}
}
Я переопределил файл учетных данных.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», запрашивать имя пользователя и пароль?