emq插件开发mysql_EMQ的Mysql插件
EMQ最新版的是EMQX3.x.x版本,一如既往的支持Mysql認證,這里專門對Mysql認證插件做個研究,寫點總結。本人能力有限,文章不足之處希望及時反饋以免誤導。
首先我先描述一下我的應用場景:我要做一個后臺,可以給EMQ創建客戶端和客戶端的ACL,從而實現對EMQ的終端進行控制。所以選擇了EMQ的Mysql插件作為基礎組件。
首先我們看看Mysql插件的基礎文檔:【傳送門】,然后我們分析一下EMQ的認證流程。我們先看一下基礎認證配置規則。
EMQ默認有個acl.conf文件,這個是第一步被加載進EMQ的權限文件,我們可以再這里配置一下設備的ACL:
%%--------------------------------------------------------------------
%%
%% [ACL](http://emqtt.io/docs/v2/config.html#allow-anonymous-and-acl-file)
%%
%% -type who() :: all | binary() |
%% {ipaddr, esockd_access:cidr()} |
%% {client, binary()} |
%% {user, binary()}.
%%
%% -type access() :: subscribe | publish | pubsub.
%%
%% -type topic() :: binary().
%%
%% -type rule() :: {allow, all} |
%% {allow, who(), access(), list(topic())} |
%% {deny, all} |
%% {deny, who(), access(), list(topic())}.
%%
%%--------------------------------------------------------------------
{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.
{allow, {ipaddr, "127.0.0.1"}, pubsub, ["$SYS/#", "#"]}.
{deny, all, subscribe, ["$SYS/#", {eq, "#"}]}.
{allow, all}.
我們拿出一個規則:【{allow, {user, "dashboard"}, subscribe, ["$SYS/#"]}.】,這個表示允許用戶名為dashboard的用戶訂閱系統topic,如果我們需要自定義ACL,只需要按照這個格式就可以,這里需要注意兩點:
Erlang的注釋符不要寫錯了,是%%,而不是#或//
規則后面有個點:【.】,這個不能丟了
配置好了以后可以通過設置mqtt客戶端的username來是實現授權。
上面說完基礎認證想必大家對權限配置有一定的了解了,我們繼續看Mysql的認證。
準備工作:?下載最新版的EMQ,先不要運行,解壓以后切換到etc目錄下。?首先,打開emqx.conf,關閉匿名模式,大概在410行的位置處,把【anonymous=true】改成【anonymous=false】;然后配置ACL相關的一些內容:在大約415行處【acl_nomatch = allow】改成【acl_nomatch = deny】;445行的【acl_deny_action=ignore】改為【acl_deny_action=disconnect】。
具體改動見下表:
emqx.conf
anonymous
true
acl_nomatch
allow
acl_deny_action
disconnect
然后打開acl.conf,把不需要的規則注釋了即可。
接下來需要配置一下Mysql的相關參數:
emq_auth_mysql.conf
auth.mysql.server
數據庫的地址
auth.mysql.pool
連接池大小,默認是8
auth.mysql.username
數據庫用戶名
auth.mysql.password
數據庫密碼
auth.mysql.database
數據庫
auth.mysql.auth_query
select password from mqttdevice where username = '%u' limit 1
auth.mysql.password_hash
plain
auth.mysql.super_query
auth.mysql.super_query = select is_superuser from mqttdevice ?where username = '%u' limit 1
auth.mysql.acl_query
auth.mysql.acl_query = select allow, ipaddr, username, clientid, access, topic from mqtt_acl where ipaddr = '%a' or username = '%u' or username = '$all' or clientid = '%c'
這里是按照官網的模板直接配置的,但是有時候,可能需要整合我們自己的業務系統,所以如果要自定義自己的系統,需要注意這幾個地方:
1. EMQ的mysql插件的那幾個SQL,select返回字段必須按照給定的格式,例如:
select password from mqttdevice where username = '%u' limit 1
其中password是必須要給出的,如果你的用戶密碼叫passwd,需要AS一下取個別名,這樣EMQ才能識別到,否則的話會報錯;
2. 關于SuperUser:SuperUser有權限訂閱所有topic,一般用作特殊作用比如監控用;
3. IP地址為NULL,代表允許任何IP,而不是我們常見的0.0.0.0,如果不對IP進行過濾,這個字段全部為空即可。
總結:EMQ的Mysql插件通過SQL的形式給用戶留了自定義業務實現的接口,熟悉規則以后還是很好用的。
總結
以上是生活随笔為你收集整理的emq插件开发mysql_EMQ的Mysql插件的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: mysql搭建主主_mysql主主配置
- 下一篇: mysql zrm 配置_利用MySQL
