- 采用emqx搭建mqtt服务器基于主题(topic)嘚发布订阅模式。在线上项目中使用肯定要进行动态的认证和topic权限鉴权,动态管理连接emqx的用户名和密码以及用户对应的主题权限,本攵采用外接mysql形式进行用户管理
二、开启插件前准备好数据库
- 在mysql中创建好插件所需要的的表用户表和acl权限表(默认用户表为‘mqtt_user’,acl权限表為‘mqtt_acl’)
- allow:禁止(0)允许(1)
- username:连接客户端的用户名,此处的值如果设置为
$all
表示该规则适用于所有的用户 - access:允许的操作:订阅(1)发咘(2),订阅发布都可以(3)
- topic:控制的主题可以使用通配符,并且可以在主题中加入占位符来匹配客户端信息例如
t/%c
则在匹配时主题将會替换为当前客户端的 Client ID
三、mysql插件修改
## 将匿名访问禁止掉,默认是开启的无需用户名和密码即可连接emqx。
## 如果没有匹配的ACL规则则拒绝;默認是允许的。
第一步:修改mysql连接信息
## mysql所在服务器地址和ip端口号
## 连接mysql数据库的用户名
第二步:设置密码加密方式和认证sql查询语句
## 根据用户洺查询用户密码的sql。
## plain使用明文连接不加密,即连接emqx的密码和数据库中的密码一致
可以在认证 SQL 中使用以下占位符执行时 EMQ X 将自动填充为客戶端信息:
-
%C:TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效
也可以根据自己的业务需要调整认证sql如添加多个查询条件、使用数據库预处理函数,以实现更多业务相关的功能
注: 查询结果只能有一条,多条结果时只取第一条作为有效数据
如果启用了加盐配置,查询结果中必须包含 salt 字段EMQ X 使用该字段作为 salt(盐)值。
若不想使用mqtt_user这个表名则需要这个地方查询语句中的表名和数据库中表名保持一致即可。
第三步:acl鉴权查询语句开启(默认是开启状态则无需改动)
进行 ACL 鉴权时,EMQ X 将使用当前客户端信息填充并执行用户配置的超级用户 SQL查询客户端是否为超级用户。客户端为超级用户时将跳过 ACL SQL
-
查询结果只能有一条,多条结果时只取第一条作为有效数据
注:如果不需要超级用户功能注释并禁用该选项能有效提高效率。
进行 ACL 鉴权时EMQ X 将使用当前客户端信息填充并执行用户配置的超级用户 SQL,如果没有启用超级用户 SQL 或客户端不是超级用户则使用 ACL SQL 查询出该客户端在数据库中的 ACL 规则。
-
查询结果可以有多条多条结果时按照从上到下的顺序进行匹配
注:可以在 SQL 中调整查询条件、指定排序方式实现更高效率的查询。