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 | |
这里是按照官网的模板直接配置的,但是有时候,可能需要整合我们自己的业务系统,所以如果要自定义自己的系统,需要注意这几个地方:
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的形式给用户留了自定义业务实现的接口,熟悉规则以后还是很好用的。