Пытался настраивать по http://activemq.apache.org/cached-ldap-authorization-module.html , но там примеры противоречат друг другу, а предлагаемый для OpenLDAP конфиг с ним несовместим.
Я поставил на локалхост OpenLDAP с пустой базой, заменил параметры в slapd.conf на рекомендованные
suffix "dc=activemq,dc=apache,dc=org"
rootdn "cn=admin,dc=activemq,dc=apache,dc=org"
rootpw {SSHA}lfAYn54xCFghgQv5B2Kqn3d3eLojqxtS
#пароль "sunflower"
Запустил OpenLDAP, импортировал рекомендованный activemq-openldap.ldif с некоторыми изменениями:
# Убрал, вызывало ошибку 53 "no global superior knowledge"
#dn: dc=apache,dc=org
#objectClass: dcObject
#objectClass: organization
#dc: apache
#o: Apache
dn: dc=activemq,dc=apache,dc=org
objectClass: dcObject
# container отсутствует в OpenLDAP, сменил на organization,
#objectClass: container
objectClass: organization
objectClass: top
# Несовместимо с objectClass=organization, сменил на o=activemq
#cn: activemq
o: activemq
dc: activemq
(Все пароли также «sunflower».)
Создал конфиг:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<broker useJmx="false" xmlns="http://activemq.apache.org/schema/core" persistent="false">
<plugins>
<authorizationPlugin>
<map>
<cachedLDAPAuthorizationMap
connectionURL="ldap://localhost:389"
connectionUsername="cn=admin,dc=activemq,dc=apache,dc=org"
connectionPassword="sunflower"
queueSearchBase="ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org"
topicSearchBase="ou=Topic,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org"
tempSearchBase="ou=Temp,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org"
refreshInterval="300000"
legacyGroupMapping="false"
/>
</map>
</authorizationPlugin>
</plugins>
<transportConnectors>
<transportConnector uri="tcp://localhost:61616"/>
</transportConnectors>
</broker>
<import resource="jetty.xml"/>
</beans>
В jetty.xml отключил аутентификацию, чтобы не мешала.
Запускаю ActiveMQ, веб интерфейс работает.
В терминале набираю
curl -XPOST -d "body=message" http://admin:sunflower@localhost:8161/api/message?destination=queue://BAR
Получаю ошибку:
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Error 500 Server Error</title>
</head>
<body><h2>HTTP ERROR 500</h2>
<p>Problem accessing /api/message. Reason:
<pre> Server Error</pre></p><h3>Caused by:</h3><pre>javax.servlet.ServletException: Could not post JMS message: javax.jms.JMSSecurityException: User is not authenticated.
...
Та же ошибка в консоли с activemq.
В чём проблема? Куда копать?
ОТВЕТ: У Jetty своя независимая аутентификация. В сети есть несколько взаимоисключающих руководств.
(Кроме того, если добавляешь плагин для авторизации, обязательно нужен и плагин для аутентификации.)
P.S.
Заодно вопрос: в DN cn=read,cn=TEST.FOOBAR,ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org есть дополнительный атрибут member равный cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org
ActiveMQ на него ругается при запуске:
ERROR | Policy not applied! Unknown member [cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org, cn=read,cn=TEST.FOOBAR,ou=Queue,ou=Destination,ou=ActiveMQ,dc=activemq,dc=apache,dc=org] in policy entry {}
javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name 'cn=notthere,ou=Group,ou=ActiveMQ,dc=activemq,dc=apache,dc=org'
Без него ошибка исчезает, но авторизация всё равно не работает.
Зачем он нужен?
ОТВЕТ: не нужен, спасибо Ivan_qrt.