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