mqtt mosquitto mysql 认证 权限

mqtt mosquitto mysql 认证

mosquitto + mysql 认证

物联网交流群:651219170

背景

mqtt 客户端链接的时候,我都希望是合法的设备才允许链接。所有我们希望在建立 tcp 链接之后立马查询数据库 mysql 进行认证,合法的链接才保留,不合法的立马断开。当然并发要求不高的时候此做法可以。而且设备一般建立链接之后也不会断开。如果真的 mysql 认证出现瓶颈了,可以查看另外一篇文章使用 redis 做认证。

下载mosquitto源码

wget http://mosquitto.org/files/source/mosquitto-1.4.14.tar.gz 
安装 mosquitto 的请看以前的博客。

下载插件源码

wget https://github.com/jpmens/mosquitto-auth-plug/archive/0.1.2.tar.gz 
编译安装插件请看 redis 认证的博客。

创建相关表结构:

用户表:

DROP TABLE IF EXISTS users;

CREATE TABLE users ( 
id int(16) AUTO_INCREMENT, 
username varchar(25) NOT NULL, 
pw varchar(128) NOT NULL, 
super int(1) NOT NULL DEFAULT 0, 
KEY username (username), 
KEY id (id
); 
创建一个索引 
CREATE 
UNIQUE INDEX 
users_username 
ON 
users (username);

创建权限表:

DROP TABLE IF EXISTS acls;

CREATE TABLE acls ( 
id int(16) AUTO_INCREMENT, 
username varchar(256) NOT NULL, 
topic varchar(256) NOT NULL, 
rw int(1) NOT NULL DEFAULT 2 COMMENT ‘1: read-only, 2: read-write’, 
PRIMARY KEY (id) 
); 
创建一个 username + topic 的索引 
CREATE 
UNIQUE INDEX 
acls_user_topic 
ON 
acls (username, topic);

配置 mosquitto

下面要根据自己实际的 mysql 用户名密码等进行更改。 
配置文件: 
关掉匿名认证 
auth_plugin /usr/local/lib/mosquitto/plugin/auth-plug.so 
auth_opt_backends mysql 
auth_opt_host localhost 
auth_opt_port 3306 
auth_opt_user root 
auth_opt_pass root 
auth_opt_dbname mqttdb 
auth_opt_userquery SELECT pw FROM users WHERE username = ‘%s’ LIMIT 1 
auth_opt_superquery SELECT IFNULL(COUNT(*), 0) FROM users WHERE username = ‘%s’ AND super = 1 
auth_opt_aclquery SELECT topic FROM acls WHERE (username = ‘%s’) AND (rw >= %d)

测试验证:

关于用户的密码是需要密文的。至于加密方式可以查看 mosquitto + redis 认证的那篇文章。 
当然我这里也有不需要存入密文的 认证插件。你可以到交流群中联系我。

插入一个超级测试用户

INSERT INTO users (username, pw, super) 
VALUES (‘admin’,’PBKDF2sha256sha256901lzMxwbgXSoPWfG3UlzMxwbgXSoPWfG3UJ/UVQWp39U8AQWpaOZhO/Rf6hlqVogm0’,1);

插入一个普通测试用户

INSERT INTO users (username, pw, super) 
VALUES (‘yuhaiyang’,’PBKDF2sha256sha256901ZjtAwEDBlctH4o5lZjtAwEDBlctH4o5lTpY7QjX8B+9PgXkO8/8TfTjfST61+xE6’,0);

select * from users; 
查看用户是否存在。

插入权限表:

INSERT INTO 
acls (username, topic, rw) VALUES 
(‘yuhaiyang’, 
‘/test-topic’, 
1);

admin 是超级用户订阅所有的频道 -t 是主题 /# 是通配符,通配所有的主题 
mosquitto_sub -v -t /# -u admin -P admin 
admin 是超级用户所以所有频道数据都能发布 -t 主题 -m 消息内容 
mosquitto_pub -t /suibian -m “nihao” -u admin -P admin

yuhaiyang 是一个普通用户仅仅对 /test-topic 主题有读权限 
mosquitto_pub -t /suibian -m “nihao” -u yuhaiyang -P yuhaiyang 
发布数据是发布不出去的。

现在用 yuhaiyang 用户定阅 /test-topic 频道超级用户来发送信息 
yuhaiyang 订阅 /test-topic 频道 
mosquitto_sub -t /test-topic -v -u yuhaiyang -P yuhaiyang 
admin 发布到这个频道 
mosquitto_pub -t /test-topic -m 123 -u admin -P admin

mosquitto redis 认证文章 
http://blog.csdn.net/yuhaiyang457288/article/details/76459707

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值