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’,’PBKDF2 sha256 901 lzMxwbgXSoPWfG3U J/UVQWp39U8AQWpaOZhO/Rf6hlqVogm0’,1);

插入一个普通测试用户

INSERT INTO users (username, pw, super)
VALUES (‘yuhaiyang’,’PBKDF2 sha256 901 ZjtAwEDBlctH4o5l TpY7QjX8B+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://www.voidcn.com/article/p-ykjyiowf-bqk.html

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院