ActiveMq
可以通过在配置文件中设置用户、密码对连接做简单的鉴权认证。
对于复杂的验证逻辑,默认是没有办法处理,只能通过自定义插件处理。
使用场景
- 每个
mqtt
客户端使用独立的用户、密码 - 连接用户的黑名单管理
- 用户和密码存在第三方的库中(数据库、redis等)
如果上万或者百万的用户需要连接broker
,在activemq
的配置文件中更新配置这些用户、密码,这种方式工作量大,容易出错,不容易管理,没有办法动态变更。
那有没有一种方案,将需访问的用户、密码保存在在第三方的库中(数据库、redis等)中,然后通过查询的方式做连接认证呢?
答案是肯定的,有!
activemq
提供了插件的方式让我们灵活的做连接认证,下面让我们一起看看如何实现这个方案。
创建maven工程
创建一个maven的工程,用于自定义认证处理。
引入activemq-broker
jar包,需要注意这里版本号需要和activemq版本一致。
1 | <dependency> |
创建认证拦截器
创建一个自定义的
BrokerFilter
,重写addConnection
方法,加入用户密码验证,如果验证失败,则抛出SecurityException
异常,这样会导致mqtt client端连接失败,从而达到认证的目的。
1 | package com.wueasy.mqtt.auth; |
创建认证插件
拆个那就一个
BrokerPlugin
认证插件,使自定义的验证拦截器AuthFilter
生效
1 | package com.wueasy.mqtt.auth; |
ActiveMq配置
把自定义认证插件,通过maven生成jar包。
把
jar
包,拷贝到ActiveMq
安装目录,lib
文件夹中。在
activemq.xml
配置文件,broker
段加入自定义的插件配置1
2
3
4
5
6
7
8<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
<!-- 插件配置 -->
<plugins>
<bean xmlns="http://www.springframework.org/schema/beans" id="AuthPlugin" class="com.wueasy.mqtt.auth.AuthPlugin"></bean>
</plugins>
</broker>
配置成功后,重启ActiveMq
源码下载
https://github.com/fallsea/mqtt
mqtt客户端下载
mqtt客户端测试工具下载地址:http://www.jensd.de/apps/mqttfx/