在閱讀本教程以前,假定你已經瞭解 MQTT、MQTT 5 以及 EMQ X 的簡單知識。html
emqx-auth-pgsql 它經過檢查每一個終端接入的 username
和 password
是否與用戶指定 的 PostgreSQL 數據庫中存儲的信息一致來實現對終端的訪問控制。其功能邏輯以下:git
本文假設 PostgreSQL 已經安裝在您的機器上,而且您能夠鏈接到 PostgreSQL 服務器。github
配置項 | 說明 |
---|---|
auth.pgsql.server | 配置須要鏈接的 PostgreSQL Server 的 host 與 port,格式爲:host[:port],省略後面的 port 時表示使用默認的 5432 端口 |
auth.pgsql.username | 用於登陸 PostgreSQL 的用戶名 |
auth.pgsql.password | 用於登陸 PostgreSQL 的密碼 |
auth.pgsql.database | 配置要訪問的數據庫 |
auth.pgsql.ssl | 配置是否使用 SSL 鏈接數據庫,默認爲否 |
auth.pgsql.auth_query | 配置從數據庫中查找用戶名對應密碼的 SQL 語句 |
auth.pgsql.password_hash | 表示存儲在數據表中的 encrypted password 使用的加密算法和加鹽方式 |
auth.pgsql.super_query | 驗證用戶是否爲超級用戶時使用的 SQL 語句 注:超級用戶能夠發佈訂閱任何主題 |
auth.pgsql.acl_query | ACL 檢查時使用的 SQL 語句 |
`emqx-auth-pgsql
提供了 mqtt.sql
文件幫助用戶快速創建數據庫環境,mqtt.sql
將在 auth.pgsql.database
指定的數據庫下建立 mqtt_user
和 mqtt_acl
兩張表,併爲 mqtt_acl
添加如下默認規則:算法
mqtt=# select * from mqtt_acl; id | allow | ipaddr | username | clientid | access | topic ----+-------+-----------+-----------+----------+--------+-------- 1 | 1 | | $all | | 2 | # 2 | 0 | | $all | | 1 | $SYS/# 3 | 0 | | $all | | 1 | eq # 4 | 1 | 127.0.0.1 | | | 2 | $SYS/# 5 | 1 | 127.0.0.1 | | | 2 | # 6 | 1 | | dashboard | | 1 | $SYS/# (6 rows)
以上規則含義可參考: [《基於 MySQL 的 EMQ X Auth & ACL》]()。sql
1.Mac 環境安裝 mosquitto數據庫
brew install mosquitto
2.導入 mqtt.sql 後,手動插入如下兩條數據服務器
mqtt=# insert into mqtt_user (id, is_superuser, username, password, salt) values (1, false, 'test', 'password', 'salt'); mqtt=# insert into mqtt_acl (id, allow, ipaddr, username, clientid, access, topic) values (7, 0, NULL, 'test', NULL, 1, 'mytopic');
3.修改配置文件測試
禁止匿名訪問:ui
## .../etc/emqx.conf allow_anonymous = false
配置數據庫中密碼的加密方式爲 plain
,既不加密:加密
## .../etc/plugins/emqx_auth_pgsql.conf auth.pgsql.password_hash = plain
配置要訪問的數據庫以及用戶名密碼:
## .../etc/plugins/emqx_auth_pgsql.conf auth.pgsql.username = root auth.pgsql.password = public auth.pgsql.database = mqtt
4.啓動 EMQ X 與 emqx-auth-pgsql
$ ./_rel/emqx/bin/emqx start emqx 3.1 is started successfully! $ ./_rel/emqx/bin/emqx_ctl plugins load emqx_auth_pgsql
5.測試
a.使用正確的用戶名和密碼進行鏈接,並訂閱 "topic" 主題
$ mosquitto_sub -p 1883 -u test -P password -t 'topic' -d Client mosqsub|4119-zhouzibode sending CONNECT Client mosqsub|4119-zhouzibode received CONNACK Client mosqsub|4119-zhouzibode sending SUBSCRIBE (Mid: 1, Topic: topic, QoS: 0) Client mosqsub|4119-zh ouzibode received SUBACK Subscribed (mid: 1): 0
現象:鏈接並訂閱成功
b.使用錯誤的用戶名或密碼進行鏈接,並訂閱 "topic" 主題
$ mosquitto_sub -p 1883 -u bad_user -P password -t 'topic' -d Client mosqsub|4363-zhouzibode sending CONNECT Client mosqsub|4363-zhouzibode received CONNACK Connection Refused: not authorised.
現象:鏈接被拒絕
c.使用正確的用戶名和密碼進行鏈接,並訂閱 "#" 主題
$ mosquitto_sub -p 1883 -u test -P password -t '#' -d
Client mosqsub|4392-zhouzibode sending CONNECT
Client mosqsub|4392-zhouzibode received CONNACK
Client mosqsub|4392-zhouzibode sending SUBSCRIBE (Mid: 1, Topic: #, QoS: 0)
Client mosqsub|4392-zhouzibode received SUBACK
Subscribed (mid: 1): 128
現象:鏈接成功,訂閱失敗,緣由碼128
d.使用正確的用戶名和密碼進行鏈接,並訂閱 "mytopic" 主題
$ mosquitto_sub -p 1883 -u test -P password -t 'mytopic' -d
Client mosqsub|4428-zhouzibode sending CONNECT
Client mosqsub|4428-zhouzibode received CONNACK
Client mosqsub|4428-zhouzibode sending SUBSCRIBE (Mid: 1, Topic: mytopic, QoS: 0)
Client mosqsub|4428-zhouzibode received SUBACK
Subscribed (mid: 1): 128
現象:鏈接成功,訂閱失敗,緣由碼128
更多信息請訪問咱們的官網 emqx.io,或關注咱們的開源項目 github.com/emqx/emqx ,詳細文檔請訪問 官方文檔。