#java #spring #rabbitmq #credentials #spring-amqp
#java #весна #rabbitmq #учетные данные #spring-amqp
Вопрос:
Я работаю с некоторыми веб-приложениями Java / Spring и RabbitMQ. У меня есть App1 и App2 на том же сервере tomcat по адресу 192.168.0.101
. Они оба взаимодействуют с сервером RabbitMQ, расположенным по адресу : 192.168.0.100
.
Приложение 1 имеет эту конфигурацию в контексте spring:
<bean id="connectionFactory"
class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory"
destroy-method="destroy">
<property name="host" value="192.168.0.100" />
<property name="username" value="app" />
<property name="password" value="guest" />
<property name="virtualHost" value="/" />
</bean>
App2 имеет ту же конфигурацию, за исключением другого имени пользователя, скажем:
<bean id="connectionFactory"
class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory"
destroy-method="destroy">
<property name="host" value="192.168.0.100" />
<property name="username" value="app2" />
<property name="password" value="guest" />
<property name="virtualHost" value="/" />
</bean>
Проблема в том, что App1 может успешно подключиться к серверу RabbitMQ, а App2 всегда имеет invalid credentials
ошибку в журналах RabbitMQ.
Вот список разрешений для этих пользователей:
Listing permissions in vhost "/" ...
app .* .* .*
app2 .* .* .*
И вот что я получаю, когда пытаюсь войти в систему с помощью API (с обоими пользователями): curl -i -u app:guest http://192.168.0.100:15672/api/whoami
и curl -i -u app2:guest http://192.168.0.100:15672/api/whoami
HTTP/1.1 401 Unauthorized
Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
Date: Mon, 30 Jun 2014 14:58:37 GMT
Content-Length: 57
{"error":"not_authorised","reason":"Not management user"}
я думаю, что это кажется довольно нормальным, каждый пользователь распознается как действительный пользователь, но не авторизован для управления. Когда я устанавливаю тег управления для app2, я получаю это :
curl -i -u app2:guest http://192.168.0.100:15672/api/whoami
HTTP/1.1 200 OK
Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
Date: Mon, 30 Jun 2014 15:14:29 GMT
Content-Type: application/json
Content-Length: 80
Cache-Control: no-cache
{"name":"app2","tags":"management","auth_backend":"rabbit_auth_backend_internal"}
Я знаю, что это много кода, но это все, что я получаю, и я собираюсь сдаться и никогда не узнаю, что происходит. Я действительно не понимаю, что я делаю не так, потому что конфигурации выглядят точно так же.
Что вы думаете?
Заранее спасибо! Много.
РЕДАКТИРОВАТЬ: Вот строка журнала RabbitMQ, которую я получаю, когда app2 пытается подключиться:
=ERROR REPORT==== 30-Jun-2014::16:42:38 ===
closing AMQP connection <0.1241.0> (192.168.0.101:52871 -> 192.168.0.100:5672):
{handshake_error,starting,0,
{amqp_error,access_refused,
"PLAIN login refused: user 'app2' - invalid credentials",
'connection.start_ok'}}
ПРАВКА2:
И вот журнал ошибок Java, который я получаю в тот момент, когда app2 пытается подключиться:
Caused by: com.rabbitmq.client.PossibleAuthenticationFailureException: Possibly caused by authentication failure
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:355)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:516)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:545)
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:181)
... 48 more
Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; reason: java.net.SocketException: Connection reset
at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:67)
at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:33)
at com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:343)
at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:216)
at com.rabbitmq.client.impl.AMQChannel.rpc(AMQChannel.java:202)
at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:347)
... 51 more
Caused by: java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
...
Комментарии:
1. Для меня это не имеет смысла; можете ли вы запустить wireshark и посмотреть на
Connection.Start-Ok
пакет? Вы должны увидеть user / pw немного позжеPLAIN
.2. Кроме того, проверьте пользователя на странице администратора, установлен ли флажок «Можно войти с паролем»?
3. Для меня тоже нет смысла! Мы попробовали Wireshark, и я вижу пакет, и в конце я вижу точно правильные имя пользователя и пароль (я изменил имя пользователя здесь, в моем сообщении, на общие имена пользователей), но я вижу «красную строку» в wireshark после
Start-Ok
пакета сRST,ACK
флагами.. О, и у пользователя установлен флажок «Может входить с паролем»… Мы анализируем пакеты для другого пользователя для сравнения.4. Я просто попытался переделать,
app2
основываясь наapp
конфигурации (просто изменил классы Java), но файлы конфигурации теперь точно такие же … тоже не сработали. Мы даже пытались завершить работуapp
, чтобы избежать возможного конфликта соединений (не сработало). И мы даже пытались использоватьapp
учетные данные (которые работают дляapp
), сapp2
, … не сработало (тот же журнал ошибок RabbitMQinvalid credentials
… и т.д. для другого имени пользователя). Может быть, это какая-то проблема с конфигурацией tomcat более низкого уровня?5. Убедитесь, что вы подключаетесь к правильному виртуальному хосту или просто к вашему пользовательскому разрешению с подстановочным знаком для всех объектов во всех виртуальных хостах для rwx, чтобы диагностировать, является ли это корнем вашей проблемы.
Ответ №1:
Поскольку время было против нас, я решил удалить и полностью удалить Tomcat с сервера и выполнить новую установку, а затем поместить каждое приложение по одному.
Угадайте, что, они оба успешно подключаются к RabbitMQ без каких-либо предупреждений / ошибок любого рода.
Итак, если кто-нибудь здесь знает, как определенная (внешняя) конфигурация tomcat может помешать ОДНОМУ приложению, в частности, взаимодействовать с RabbitMQ, добро пожаловать…
Под «внешней» я подразумеваю конфигурацию, «не связанную с приложением». Я на самом деле не эксперт по Tomcat, я знаю, что есть много файлов и много способов их настройки, и мне все еще интересно узнать, что произошло.
Комментарии:
1. Я не понимаю, как это имеет / имело какое-либо отношение к Tomcat — в вашем вопросе говорилось, что ваша конфигурация фабрики соединений была весной (вы не используете JNDI). Очень странно.