配置完管控台的安全之后,我们还要配置客户端连接安全,否则大家都可以往MQ上发送消息,这样太危险!
根据官方文档,http://activemq.apache.org/security.html
ActiveMQ配置客户端安全有两种方式,
ActiveMQ 4.x及更高版本通过各种不同的提供商提供可插拔的安全性。 最常见的提供者是
JAAS进行身份验证
一个使用简单XML配置文件的默认授权机制。
首先我们看一下简单的XML形式授权机制
直接在conf/activemq.xml里如下配置即可
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
${activemq.username}, ${activemq.password}
引入的是conf/credentials.properties 里面的配置
在客户端连接时候配置响应的用户名,密码即可
第二种使用JAAS身份认证
首先查看配置文件conf/login.config ,users.properties,groups.properties 三个配置文件
activemq {
org.apache.activemq.jaas.PropertiesLoginModule required
org.apache.activemq.jaas.properties.user="users.properties"
org.apache.activemq.jaas.properties.group="groups.properties";
};
<plugins>
<!-- use JAAS to authenticate using the login.config file on the classpath to configure JAAS -->
<jaasAuthenticationPlugin configuration="activemq-domain" /> <!-- lets configure a destination based authorization mechanism -->
<authorizationPlugin>
<map>
<authorizationMap>
<authorizationEntries>
<authorizationEntry queue=">" read="admins" write="admins" admin="admins" />
<authorizationEntry queue="USERS.>" read="users" write="users" admin="users" />
<authorizationEntry queue="GUEST.>" read="guests" write="guests,users" admin="guests,users" /> <authorizationEntry topic=">" read="admins" write="admins" admin="admins" />
<authorizationEntry topic="USERS.>" read="users" write="users" admin="users" />
<authorizationEntry topic="GUEST.>" read="guests" write="guests,users" admin="guests,users" /> <authorizationEntry topic="ActiveMQ.Advisory.>" read="guests,users,admins" write="guests,users,admins" admin="guests,users,admins"/>
</authorizationEntries> <!-- let's assign roles to temporary destinations. comment this entry if we don't want any roles assigned to temp destinations -->
<tempDestinationAuthorizationEntry>
<tempDestinationAuthorizationEntry read="tempDestinationAdmins" write="tempDestinationAdmins" admin="tempDestinationAdmins"/>
</tempDestinationAuthorizationEntry>
</authorizationMap>
</map>
</authorizationPlugin>
</plugins>
queue=">"代表所有队列,read="admins" write="admins" 代表admins组账号都可以读写,admin="admins"代表admins组账号可以创建queues,这里需要注意的是configuration=“”的值一定要和login.config里面的一致
由users.properties文件可知,admin=admin 用户名和密码都是admin
测试代码如下
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MqApplication.class)
public class MqTest { @Autowired
JmsMessagingTemplate jmsMessagingTemplate; //发送String消息
@Test
public void testStr() {
try {
//往luna队列发送消息
jmsMessagingTemplate.convertAndSend("luna","to luna queue ");
} catch (Exception e) {
e.printStackTrace();
}
}
}
我们往queue发送队列正常,看着是正确,等等,点击Name查看以下queue内容, 控制台出现以下错误,日志错误如下,这是什么原因呢?
because Failed with SecurityException: User name [system] or password is invalid.
接着看官方文档,
也就是说,默认的username和password还是在credentials.properties,而我们JAAS配置的是admin=admin,怎么办呢?
第一种方式如下,在credentials.properties中新加如下,重启ActiveMQ测试
刷新ActiveMQ管控台正常看到queues数据
第二种方式,不修改credentials.properties,我们在users.properties中加入system=manager
在groups.properties中新加
接着刷新ActiveMQ管控台可以正常看到数据