emq mysql_EMQ的Mysql插件

  • Post author:
  • Post category: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的形式给用户留了自定义业务实现的接口,熟悉规则以后还是很好用的。



版权声明:本文为weixin_35656580原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。