emqx开启mysql插件进行动态认证鉴权

                                        emqx开启mysql插件

一、简述

  1. 采用emqx搭建mqtt服务器,基于主题(topic)的发布订阅模式。在线上项目中使用,肯定要进行动态的认证和topic权限鉴权,动态管理连接emqx的用户名和密码,以及用户对应的主题权限,本文采用外接mysql形式进行用户管理。

二、开启插件前准备好数据库

  1. 在mysql中创建好插件所需要的的表用户表和acl权限表(默认用户表为‘mqtt_user’,acl权限表为‘mqtt_acl’)
    1. 建表语句如下:
      CREATE TABLE `mqtt_user` (
        `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
        `username` varchar(100) DEFAULT NULL,
        `password` varchar(100) DEFAULT NULL,
        `salt` varchar(35) DEFAULT NULL,
        `is_superuser` tinyint(1) DEFAULT 0,
        `created` datetime DEFAULT NULL,
        PRIMARY KEY (`id`),
        UNIQUE KEY `mqtt_username` (`username`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
      
      
      CREATE TABLE `mqtt_acl` (
        `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
        `allow` int(1) DEFAULT 1 COMMENT '0: deny, 1: allow',
        `ipaddr` varchar(60) DEFAULT NULL COMMENT 'IpAddress',
        `username` varchar(100) DEFAULT NULL COMMENT 'Username',
        `clientid` varchar(100) DEFAULT NULL COMMENT 'ClientId',
        `access` int(2) NOT NULL COMMENT '1: subscribe, 2: publish, 3: pubsub',
        `topic` varchar(100) NOT NULL DEFAULT '' COMMENT 'Topic Filter',
        PRIMARY KEY (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  2. 表字段说明   
  • allow:禁止(0),允许(1)
  • ipaddr:设置 IP 地址
  • username:连接客户端的用户名,此处的值如果设置为 $all 表示该规则适用于所有的用户
  • clientid:连接客户端的 Client ID
  • access:允许的操作:订阅(1),发布(2),订阅发布都可以(3)
  • topic:控制的主题,可以使用通配符,并且可以在主题中加入占位符来匹配客户端信息,例如 t/%c则在匹配时主题将会替换为当前客户端的 Client ID
    • %u:用户名
    • %c:Client ID

三、mysql插件修改

1、首先把emqx安装目录下的etc/emqx.conf中配置修改:

## 将匿名访问禁止掉,默认是开启的,无需用户名和密码即可连接emqx。
allow_anonymous = false

## 如果没有匹配的ACL规则,则拒绝;默认是允许的。
acl_nomatch = deny

2、修改mysql插件配置里面的信息(位于emqx的etc/plugins/emqx_auth_mysql.conf):

第一步:修改mysql连接信息,

# etc/plugins/emqx_auth_mysql.conf

## mysql所在服务器地址和ip端口号
auth.mysql.server = 127.0.0.1:3306

## 连接池大小
auth.mysql.pool = 8

## 连接mysql数据库的用户名
auth.mysql.username = emqx

## 连接mysql数据库的密码
auth.mysql.password = public

## mqtt_user和mqtt_acl这两张表所属的数据库
auth.mysql.database = mqtt

auth.mysql.query_timeout = 5s

第二步:设置密码加密方式和认证sql查询语句

##    根据用户名查询用户密码的sql。
auth.mysql.auth_query = select password from mqtt_user where username = '%u' limit 1


##    plain使用明文连接,不加密,即连接emqx的密码和数据库中的密码一致
auth.mysql.password_hash = plain

可以在认证 SQL 中使用以下占位符,执行时 EMQ X 将自动填充为客户端信息:

  • %u:用户名
  • %c:Client ID
  • %C:TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效
  • %d:TLS 证书 subject,仅当 TLS 连接时有效

也可以根据自己的业务需要调整认证sql,如添加多个查询条件、使用数据库预处理函数,以实现更多业务相关的功能。

注: 查询结果只能有一条,多条结果时只取第一条作为有效数据。

如果启用了加盐配置,查询结果中必须包含 salt 字段,EMQ X 使用该字段作为 salt(盐)值。

查询结果必须包含password,若表中密码字段为pwd则此处查询的password使用as语法;例如pwd as password。

若不想使用mqtt_user这个表名,则需要这个地方查询语句中的表名和数据库中表名保持一致即可。

第三步:acl鉴权查询语句开启(默认是开启状态,则无需改动)

 超级用户SQL(super_query)

进行 ACL 鉴权时,EMQ X 将使用当前客户端信息填充并执行用户配置的超级用户 SQL,查询客户端是否为超级用户。客户端为超级用户时将跳过 ACL SQL。

  1. 查询结果中必须包含 is_superuser 字段,is_superuser 应该显式的为 true
  2. 查询结果只能有一条,多条结果时只取第一条作为有效数据

注:如果不需要超级用户功能,注释并禁用该选项能有效提高效率。

ACL SQL(acl_query)

进行 ACL 鉴权时,EMQ X 将使用当前客户端信息填充并执行用户配置的超级用户 SQL,如果没有启用超级用户 SQL 或客户端不是超级用户,则使用 ACL SQL 查询出该客户端在数据库中的 ACL 规则。

  1. 查询结果中必须包含 allow、access、topic、clientid、username、ipaddr 字段,如果字段不想参与比对则使用 $all 字符串或者数据库 NULL 值
  2. 查询结果可以有多条,多条结果时按照从上到下的顺序进行匹配

注:可以在 SQL 中调整查询条件、指定排序方式实现更高效率的查询。

以上操作均在Linux环境下,Windows环境下可能会存在异常(PS:本人遇到过)                                                 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
EMQ X 支持使用 MySQL 进行认证,具体配置步骤如下: 1. 安装 MySQL 和 Python 的 MySQL 驱动程序 2. 创建 EMQ X 所需的数据库和数据表,可以使用以下 SQL 语句: ```sql CREATE DATABASE emqx_auth; USE emqx_auth; CREATE TABLE mqtt_user ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(100) NOT NULL, password VARCHAR(100) NOT NULL, is_superuser BOOL NOT NULL DEFAULT FALSE, PRIMARY KEY (id), UNIQUE KEY mqtt_user_username_uindex (username) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; CREATE TABLE mqtt_acl ( id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, allow INT(1) NOT NULL DEFAULT 1, ipaddr VARCHAR(60) NOT NULL DEFAULT '', username VARCHAR(100) NOT NULL, clientid VARCHAR(100) NOT NULL, access INTEGER(2) NOT NULL, topic VARCHAR(256) NOT NULL, PRIMARY KEY (id), KEY mqtt_acl_username_clientid_topic_uindex (username,clientid,topic) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ``` 3. 配置 EMQ X,编辑 emqx.conf 文件,将 auth.acl.auth_mysql 和 auth.user.auth_mysql 配置为 true,同时配置数据库连接信息,例如: ```conf auth.user.auth_mysql = on auth.user.mysql.server = 127.0.0.1:3306 auth.user.mysql.username = root auth.user.mysql.password = root auth.user.mysql.database = emqx_auth auth.user.mysql.pool = 8 auth.acl.auth_mysql = on auth.acl.mysql.server = 127.0.0.1:3306 auth.acl.mysql.username = root auth.acl.mysql.password = root auth.acl.mysql.database = emqx_auth auth.acl.mysql.pool = 8 ``` 4. 重启 EMQ X,使配置生效。 注意:以上配置仅供参考,实际配置应根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Qubb

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值