(1)为什么写这个话题(Why)
读万卷书不如行千里路。这次搭建MQTT服务,遇到了一些误解,特此记录备忘。
主要包括:
(1)服务(Broker)的账户管理与网页管理平台的账户
(2)与web应用的集成(Spring系)
(2)ActiveMQ版本选择
因为JAVA环境是JDK 8,所以按兼容性考虑选择了ActiveMQ 5.15的最后版本5.15.15。
如果你是JDK 11则可考虑ActiveMQ的最新版本5.17或5.18。
ActiveMQ支持MQTT v3.1.1 and v3.1。
(3)ActiveMQ账户管理的场景
作为回顾,ActiveMQ服务器的账户管理可分为2个部分:服务(Broker)的账户管理和网页管理平台的,两者之间甚至是毫无干系。
首先,服务(Broker)是核心,即:即使不登录网页管理平台,MQTT服务依旧运行。
其次,网页管理平台是便利化工具,方便用户使用UI查看主题(Topics)的运行情况。
(3.1)服务(Broker)的账户管理
涉及到目录conf下的3个文件:activemq.xml、groups.properties、credentials.properties(可选)。
相关文档地址:https://activemq.apache.org/security。
本文采用的是简单验证插件方式(Simple Authentication Plugin)。即:
- 在【activemq.xml】添加账户信息(在<broker>标签内<shutdownHooks>标签后):
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="admin1" password="***" groups="admins,users"/>
<authenticationUser username="user1" password="***" groups="users"/>
<authenticationUser username="guest1" password="***" groups="guests"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
- 其中groups定义的内容在【groups.properties】进行定义:
admins=admin1,admin2,...
users=user1,user2,...
guests=guest1,guest2,...
- 如果在activemq.xml中的用户名和密码采用占位符,例如:
<authenticationUser username="${user1.username}" password="${user1.password}" groups="users"/>
则对应的用户名和密码在【credentials.properties】中集中设置,例如:
user1.username=user1
user1.password=***
admin1.username=admin1
admin1.password=***
注意:到这里,ActiveMQ服务启动后,MQTT服务也将启动,其服务端口默认为1883。
使用相关客户端工具(例如:MQTTBox)即可使用对应账户进行连接测试。
(3.2)网页管理平台的账户管理
如大多数博文所说,ActiveMQ网页管理平台基于jetty(从【activemq.xml】中包含jetty.xml也可以获知),其身份验证信息将从【jetty.xml】和【jetty-realm.properties】中获取。
- 在【jetty.xml】打开身份验证(默认是打开的、检查一下而已),如下:
<bean id="securityConstraint" class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="user,admin" />
<!-- set authenticate=false to disable login -->
<property name="authenticate" value="true" />
</bean>
<bean id="adminSecurityConstraint" class="org.eclipse.jetty.util.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="admin" />
<!-- set authenticate=false to disable login -->
<property name="authenticate" value="true" />
</bean>
- 在【jetty-realm.properties】设置账号信息,如下:
# username: password [,rolename ...]
admin1: ***, admin
admin2: ***, admin
user1: ***, user
user2: ***, user
ActiveMQ服务启动后,jetty服务也相应启动。对应端口为8161。
(4)结语
自此,ActiveMQ服务的两部分账号管理设置结束。
再次强调,网页管理平台是便利化工具,方便用户使用UI查看主题(Topics)的运行情况,并非必须配置,
其服务端口8161无需对外开放。
管理员只需开放相关服务端口即可,例如:MQTT默认1883,AMQP默认为5672。