【问题标题】:Authenticating a dockerized Spring Boot app against a dockerized & linked ActiveMQ针对 dockerized & linked ActiveMQ 对 dockerized Spring Boot 应用程序进行身份验证
【发布时间】:2015-06-24 14:20:09
【问题描述】:

我正在像这样启动我的 activemq 容器:

docker run -p 61616:61616 -p 8161:8161 --name='activemq' -d \
-e 'ACTIVEMQ_LOGLEVEL=DEBUG' \
-e 'ACTIVEMQ_ADMIN_USER=bot' \
-e 'ACTIVEMQ_ADMIN_PASSWORD=blahblah' \
-e 'ACTIVEMQ_OWNER_LOGIN=bot' \
-e 'ACTIVEMQ_OWNER_PASSWORD=blahblah' \
-e 'ACTIVEMQ_JMX_LOGIN=bot' \
-e 'ACTIVEMQ_JMX_PASSWORD=blahblah' \
-v /data/activemq:/data/activemq \
-v /var/log/activemq:/var/log/activemq \
webcenter/activemq:latest

我的应用的 application.yml 具有以下内容:

spring:
  activemq:
    broker-url: ${ACTIVEMQ_PORT_61616_TCP}
    user: bot
    password: blahblah

我正在像这样启动我的应用容器:

docker run --name='myapp' \
-w /app/ -v /home/ubuntu/myapp/logs:/app/logs \
-v /home/ubuntu/myapp/config:/app/config \
-v /tmp:/tmp -p 4980:4980 \
--link activemq:activemq \
-d myapp

请注意,我正在将我的应用程序容器与 activemq 容器链接。

最后,当我尝试从我的应用程序(通过 Camel 路由 - 但我认为这不相关)向 activeMQ 发送消息时,我在日志中看到了这一点:

javax.jms.JMSSecurityException: User name [bot] or password is invalid.
    at org.apache.activemq.util.JMSExceptionSupport.create(JMSExceptionSupport.java:52)
    at org.apache.activemq.ActiveMQConnection.syncSendPacket(ActiveMQConnection.java:1417)
    at org.apache.activemq.ActiveMQConnection.ensureConnectionInfoSent(ActiveMQConnection.java:1522)
    at org.apache.activemq.ActiveMQConnection.start(ActiveMQConnection.java:527)
    at org.springframework.jms.listener.AbstractJmsListeningContainer.refreshSharedConnection(AbstractJmsListeningContainer.java:400)
    at org.springframework.jms.listener.DefaultMessageListenerContainer.refreshConnectionUntilSuccessful(DefaultMessageListenerContainer.java:907)
    at org.springframework.jms.listener.DefaultMessageListenerContainer.recoverAfterListenerSetupFailure(DefaultMessageListenerContainer.java:882)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1053)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.SecurityException: User name [bot] or password is invalid.
    at org.apache.activemq.security.JaasAuthenticationBroker.addConnection(JaasAuthenticationBroker.java:80)
    at org.apache.activemq.broker.BrokerFilter.addConnection(BrokerFilter.java:92)
    at org.apache.activemq.broker.MutableBrokerFilter.addConnection(MutableBrokerFilter.java:97)
    at org.apache.activemq.broker.TransportConnection.processAddConnection(TransportConnection.java:764)
    at org.apache.activemq.broker.jmx.ManagedTransportConnection.processAddConnection(ManagedTransportConnection.java:79)
    at org.apache.activemq.command.ConnectionInfo.visit(ConnectionInfo.java:139)
    at org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:294)
    at org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:148)
    at org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50)
    at org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:113)
    at org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:270)
    at org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
    at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214)
    at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196)
    ... 1 common frames omitted
Caused by: javax.security.auth.login.LoginException: No LoginModules configured for activemq-domain
    at javax.security.auth.login.LoginContext.init(LoginContext.java:264)
    at javax.security.auth.login.LoginContext.<init>(LoginContext.java:417)
    at org.apache.activemq.security.JaasAuthenticationBroker.addConnection(JaasAuthenticationBroker.java:72)
    ... 14 common frames omitted

不用说,在我的开发机器上本地运行这些组件(即未 dockerized)时,这一切都“正常工作”。只是在 EC2 实例上的 docker 容器中不起作用。

任何和所有帮助表示赞赏!

谢谢。

【问题讨论】:

  • 你的 spring 应用会加载环境变量吗?
  • @Michael 是的。我可以在日志中看到一些只能来自 yml 文件的其他内容。另外,在介绍 env 之前,我之前遇到过连接异常。 spring.activemq.broker-url 的变量。现在我得到了这个身份验证异常。这表明它现在正在连接 - 只有在读取 yml 文件后才能这样做。

标签: spring docker spring-boot activemq


【解决方案1】:

我最终通过自定义 docker 映像使其工作,如下所示:

  1. 克隆 git 存储库:git clone https://github.com/disaster37/activemq.git

  2. 修复此文件中传递给 curl 的 URL:assets/setup/install (该文件中的当前网址不再有效)

  3. 编辑此文件:assets/config/activemq.xml 并将 &lt;jaasAuthenticationPlugin&gt;&lt;authorizationPlugin&gt; 元素替换为:

<simpleAuthenticationPlugin anonymousAccessAllowed="false"> <users> <authenticationUser username="system" password="blubblub" groups="users,admins"/> <authenticationUser username="bot" password="blahblah" groups="users"/> </users> </simpleAuthenticationPlugin>

  1. 构建我自己的 docker 镜像:docker build --tag="zackattack/activemq"

  2. 运行它:docker logs -f $(docker run --name='activemq' -d zackattack/activemq)

它不漂亮 - 但它有效!

【讨论】:

  • 我在这个 repo 中没有看到 assets/config/activemq.xml。我应该创建它吗?
  • 看起来该仓库的维护者已将其删除。你仍然可以在他的 5.10.0 标签中找到它:https://github.com/disaster37/activemq/tree/5.10.0
【解决方案2】:

根据我可以从调试日志中收集到的信息来判断。首先,调试日志显示“bot”正在跨越(名称),因此 myapp 和 activemq 之间似乎存在连接。所以联动是有效的。我的线索是:

Caused by: javax.security.auth.login.LoginException: No LoginModules configured for activemq-domain

我不知道登录模块是什么,但是,我冒昧地猜测您需要告诉 activemq 如何处理它收到的名称/密码?查看docker hub上关于activemq的描述,有一个例子:

-e 'ACTIVEMQ_READ_LOGIN=consumer_login' -e 'ACTIVEMQ_READ_PASSWORD=consumer_password'\

-e 'ACTIVEMQ_STATIC_TOPICS=topic1;topic2;topic3' -e 'ACTIVEMQ_STATIC_QUEUES=queue1;queue2;queue3'

是否可能需要这些设置中的任何一个来配置 activemq-domain 登录模块?还是在某处的配置文件中完成?从码头工人的角度来看,我认为一切都井井有条。我认为activemq存在配置问题。当这在你的常规环境中工作时,你如何启动activemq(命令行参数、环境变量和配置文件是什么)?

【讨论】:

猜你喜欢
  • 2017-12-24
  • 2022-10-13
  • 1970-01-01
  • 2017-12-29
  • 2019-11-06
  • 2018-08-20
  • 2020-07-07
  • 1970-01-01
  • 2021-01-29
相关资源
最近更新 更多