布景
测试demo安装emqx时,首先考虑的功能性测试,并没有考虑太多的安全性需求,因而,emqx敞开的是匿名办法,现在要上生产环境,需要选用用户认证的办法。
现象
emqx按照原先的办法布置,敞开了匿名校验,设置了用户认证办法,emqx管理界面plugins中也敞开了用户认证插件,可是重新启动渠道时,一向报错:mqtt user authorization is refused the collection,即用户无权衔接,可是使用MQTT客户端衔接认证成功,能够衔接上,所以乎问题有点盘旋了。
处理办法
1、防火墙敞开所有有关MQTT衔接的端口
问题出现的第一反应是客户端衔接不到认证服务器,所以服务器大将所有有关mqtt衔接的端口全部敞开出来,重启了渠道,可是问题仍然在。
2、代码排查
考虑道路:
(1)MQTT客户端能够衔接,可是渠道衔接认证不通过,同样恳求的是1883的端口,那么说明1883自身端口没有问题;
(2)那么问题可能出现在代码用户认证上,查看了一下SpringBoot中的yaml文件,有关mqtt的装备,发现是正确的;
(3)那么就有一种可能,在恳求1883端口时,用户认证信息并没有正确携带
(4)所以乎找到问题根源了
查看了代码创立mqtt衔接的办法,仅仅使用了url和主题,而用户信息并没有正确创立,所以定位到问题根源了
(5)处理问题
public MqttConnectOptions getMqttConnectOptions() {
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(username);
options.setPassword(password.toCharArray());
options.setServerURIs(new String[]{url});
options.setConnectionTimeout(completionTimeout);
return options;
}
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
factory.setConnectionOptions(getMqttConnectOptions());
return factory;
}
@Bean
public MessageProducerSupport mqttInbound() {
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(clientId,mqttClientFactory(), topic);
adapter.setCompletionTimeout(completionTimeout);
adapter.setConverter(new DefaultPahoMessageConverter());
adapter.setQos(1);
adapter.setOutputChannel(new DirectChannel());
return adapter;
}
上面就是修改后的关键代码,主要是在将用户信息填充到衔接特点中,并使用工厂形式创立了一个通道适配器,这样程序启动时便会初始化这些bean,实现与MQTT服务器的衔接并监听装备进去的主题。
至此这个填坑过程完成。
总结
排查问题看日志很重要,可是学会正确的剖析日志文件也是需要经验以及正确思路剖析的,假如对MQTT的一些常用端口号了解多一些,刚开始就不会认为是端口号的问题了,多走了两步弯路,今后要注意。