activemq mqtt基于db做连接认证

       本文的目的是通过开发定制化的插件来实现activemq的登录认证。

                                          

       当然,activemq可以通过在配置文件中设置用户、密码对连接做简单的鉴权认证。

  想想这个应用场景:

     1.每个mqtt client有独自的clientId、用户、密码

     2.随着时间的推移,原有的mqtt  client不再允许访问broker,而新的mqtt client在持续的增加

 

     如果成百上千的mqtt  client需要连接broker,在activemq的配置文件中更新配置这些用户、密码,这种方式工作量大,容易出错。

 

     那有没有一种方案,将需访问的用户、密码保存在db中,然后通过查询db的方式做连接认证呢?答案是肯定的,有!

 

     activemq提供了插件的方式让我们灵活的做连接认证,下面让我们一起看看如何实现这个方案。

 

     1. 创建一个java application,mvn文件中加入activemq的依赖包。jar包的版本与部署的activemq保持一致。

         <dependency>
               <groupId>org.apache.activemq</groupId>
               <artifactId>activemq-broker</artifactId>
                <version>5.15.0</version>
            </dependency>

 

      2. 创建一个broker plunin类,这类主要是在安装插件时,返回一个BrokerFilter。此例中返回AuthFilter,这个class请参考第3步

    package com.study.mqttatuh;

           import org.apache.activemq.broker.Broker;
           import org.apache.activemq.broker.BrokerFilter;
           import org.apache.activemq.broker.BrokerPlugin;

           public class LoginAuthPlugin implements BrokerPlugin {

              public Broker installPlugin(Broker broker) throws Exception {
                   return new AuthFilter(broker);
              }

           }

 

     3. 创建一个broker filter。关键地方就在于重载了addConnection这个方法,加入了用户密码验证,如果验证失败,则抛出SecurityException这样会导致mqtt client端连接失败,从而达到认证的目的。

            package com.study.mqttatuh;

import org.apache.activemq.broker.Broker;
               import org.apache.activemq.broker.BrokerFilter;

               import org.apache.activemq.broker.ConnectionContext;
               import org.apache.activemq.command.ConnectionInfo;

public class AuthFilter extends BrokerFilter {

 public AuthFilter(Broker next) {
                  super(next);
               }
 
              @Override 
               public void addConnection(ConnectionContext context, 
            ConnectionInfo info) throws Exception {
              auth(info.getUserName(),info.getPassword());
              super.addConnection(context, info);
             }
 
            private void auth(String userName,String password)
            {

//为了演示方便写死了要验证的用户密码,实际实施时查db验证
               if(!"userName1".equals(userName) || !"password1".equals(password))
               {
                   throw new SecurityException("Invalid  userName or password!");
               }
             }

}

 

     4.导出jar包。比如,此例中导出的jar包名为:mqttatuh-0.0.1-SNAPSHOT.jar

     5.上传jar包到activemq部署目录的lib目录下


[root@localhost lib]# pwd

/usr/apache-activemq-5.15.0/lib

[root@localhost lib]# ls

activemq-broker-5.15.0.jar           activemq-rar.txt                             geronimo-jta_1.0.1B_spec-1.0.1.jar

activemq-client-5.15.0.jar           activemq-spring-5.15.0.jar                   hawtbuf-1.11.jar

activemq-console-5.15.0.jar          activemq-web-5.15.0.jar                      jcl-over-slf4j-1.7.25.jar

activemq-jaas-5.15.0.jar             camel                                        mqttatuh-0.0.1-SNAPSHOT.jar

activemq-kahadb-store-5.15.0.jar     extra                                        optional

activemq-openwire-legacy-5.15.0.jar  geronimo-j2ee-management_1.1_spec-1.0.1.jar  slf4j-api-1.7.25.jar

activemq-protobuf-1.1.jar            geronimo-jms_1.1_spec-1.1.1.jar              web



     6.修改activemq的配置文件activemq.xml,broker段加入自定义的插件配置(plugins段为新增的

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">

...(省略其它配置信息) 

<plugins>

          <bean xmlns="http://www.springframework.org/schema/beans"

         id="LoginAuthPlugin" class="com.study.mqttatuh.LoginAuthPlugin">

         </bean>

</plugins>

...(省略其它配置信息)

</broker>

    7.重启activemq

    

    至此,我们的认证插件就安装配置好了。mqtt client试图建立连接时,如果提供的账号密码不匹配,则在AuthFilter中就会验证失败报SecurityException:Invalid  userName or password!


    当然此文的目的只是抛砖引玉,在AuthFilter的auth认证方法中,可以调用其它的认证接口服务来做登录认证;BrokerFilter中还有一些其它的方式,可供挖掘扩展,比如消息拦截、日志等。

   

 

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot提供了与ActiveMQMQTT集成的功能。你可以使用Spring Boot的相关依赖来实现这些集成。 首先,你需要在你的项目中导入相应的依赖。对于ActiveMQ的集成,你可以通过在pom.xml文件中添加以下依赖来实现: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency> ``` 这样就可以使用Spring Boot提供的ActiveMQ功能。你可以根据需要进行配置和使用,包括创建后台消费者、生产者、消息发送接口、发送消息业务类等等。 另外,如果你想要使用MQTT协议进行消息的发送和接收,你可以通过在pom.xml文件中添加相应的依赖来实现: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId> </dependency> <dependency> <groupId>org.springframework.integration</groupId> <artifactId>spring-integration-mqtt</artifactId> </dependency> ``` 这样就可以使用Spring Boot提供的MQTT集成功能。你可以根据需要进行配置和使用,包括创建MQTT的消息发送和接收等相关配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot 整合 ActiveMQ、RabbitMQ(direct、topic模式)、RocketMQ详解代码示例](https://blog.csdn.net/qq_38132105/article/details/126199813)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Springboot学习笔记(消息及activemq,rabbitmq,rocketmq和kafka)](https://blog.csdn.net/weixin_53011574/article/details/125629515)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [SpringBoot+ActiveMq+MQTT实现消息的发送和接收](https://download.csdn.net/download/yangyi30/10786299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值