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

插入一個普通測試用戶

INSERT INTO users (username, pw, super)
VALUES (‘yuhaiyang’,’PBKDF2sha256 901ZjtAwEDBlctH4o5l 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://blog.csdn.net/yuhaiyang457288/article/details/76459707

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章