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