一、前言
作为项目上的配置记录,担心以后自己都忘了自己是如何配置的了。接一年前的博文,在ubuntu上成功搭建MQTT服务器后,并已经稳定使用了一年(具体的搭建过程,可以详细参考这边博文,写的非常的详细。ubuntu上搭建MQTT服务器)。现在在项目上遇到了一个这样的问题,如果我不去控制每个连接账号的权限,任意让知道了账号和密码的人都可以订阅任何主题,和发布任何主题,这显然是不可行的。例如,我为客户开放一个主题,但是他却可以修改主题,去订阅其他消息,我不想让他推送消息,可他却可以自由推送消息。好在Mosquitto提供了非常方便的权限控制,可以设定每个用户订阅/发布权限、也可以设定每个用户可访问的topic范围、从而达到权限控制的目的。
注:以下配置和服务器的搭建设置联系比较紧密,所以请详细先看看搭建的链接。
二、具体实现配置
1. 新增访问账号
#新增一个账号为 visit 注意这里增加账户不需要添加参数-c 不然会把第一次创建的账户覆盖
sudo mosquitto_passwd /etc/mosquitto/passwd visit_1
#之后会输入两次设置的密码进行确认
#设置成功后,查看这个文件,就可以看到自己添加的新增账号和密码(密码显示的是经过加密的)
cd /etc/mosquitto
sudo vim passwd
可以看到如下图,我之前有一个账户为***ISC和一个刚才新增的账户visit_1
2. 设置访问账号权限
新增账户之后,就要设置访问权限
#创建权限控制文件
sudo vim acl
#在文本中添加一下内容
user visit_1
topic read TEST/TEST1/#
user ***ISC
topic TEST/#
#以上添加了用户visit_1的访问权限为只能订阅。且只能接收主题为TEST/TEST1/分层下的内容
#而用户***ISC没有限制读或者写权限,所以这个用户既有订阅权限又有发布权限
#visit_1用户如需设置发布权限 将参数改为 write
3. 指定访问权限文件的路径
设置好用户的访问权限文件后,需要在配置文件中进行设置访问权限配置文件的路径。
此时在当前目录下可以看到如上一些文件
acl文件: 前面我们自己创建的配置访问权限的文件
passwd文件: 创建的用户和密码
conf.d文件夹:默认系统配置文件夹
进入系统配置文件夹进行修改
cd conf.d
sudo vim default.conf
在默认的配置文件中添加用户访问权限控制文件的路劲(最后一行)
allow_anonymous false #禁止匿名登录
password_file /etc/mosquitto/passwd #指定账号和密码路劲
acl_file /etc/mosquitto/acl #指定访问权限路劲
最后重启mqtt服务
sudo systemctl restart mosquitto
三、测试
使用MQTTBox进行测试。分别使用用户visit_1和***ISC创建两个客户端
1. visit_1 自订阅,自发布
可以看到,visit_1用户自己订阅自己发布的主题,自己没有收到数据。这是因为前面限制了visit_1用户只有订阅权限,没有发布权限。
2. ***ISC发布数据,visit_1订阅数据
先看看***ISC,是可以自订自发数据的。
***ISC发布主题为TEST/TEST1/1234,可以看到visit_1也收到了发布的数据
当***ISC发布主题为TEST/TEST2时,visit_1无法接收到数据,因为visit_1被限制在只能访问主题TEST/TEST1/下的内容