了解了 Clientid 认证后,现在我们再来了解下 Mysql 插件认证以及访问控制,默认关闭了匿名认证

一、创建用户表和控制表

根据官方文档,用户表的名称为:mqtt_user,访问控制表的名称为:mqtt_acl

mqtt_user

CREATE TABLE mqtt_user (

id int(11) unsigned NOT NULL AUTO_INCREMENT,

username varchar(8) DEFAULT NULL COMMENT 'mqtt用户名',

password varchar(12) DEFAULT NULL COMMENT 'mqtt密码',

salt varchar(20) DEFAULT NULL COMMENT '加盐随机变量',

is_superuser tinyint(1) DEFAULT 0 COMMENT '是否为超级用户: 0=否1=是',

create_time datetime DEFAULT NULL COMMENT '创建时间',

modify_time datetime DEFAULT NULL COMMENT '修改时间',

PRIMARY KEY (id),

UNIQUE KEY uk_username (username)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='mqtt用户表';

mqtt_acl

CREATE TABLE mqtt_acl (

id int(11) unsigned NOT NULL AUTO_INCREMENT,

allow int(1) DEFAULT NULL COMMENT '是否允许连接: 0=拒绝1=允许',

ipaddr varchar(60) DEFAULT NULL COMMENT 'mqtt客户端IP地址',

username varchar(8) NOT NULL COMMENT 'mqtt用户名',

clientid varchar(100) DEFAULT NULL COMMENT 'clientId',

access int(2) NOT NULL COMMENT '行为类型: 1=订阅2=发布3=订阅+发布',

topic varchar(100) NOT NULL DEFAULT '' COMMENT '主题',

create_time datetime DEFAULT NULL COMMENT '创建时间',

modify_time datetime DEFAULT NULL COMMENT '修改时间',

PRIMARY KEY (id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='mqtt权限控制表';

二、配置mysql认证

在 etc/plugins 目录下修改 emq_auth_mysql.conf 配置文件

cd /usr/local/emqtt/emqttd/etc/plugins

vim emq_auth_mysql.conf

添加数据库连接配置,保存并退出

## MySQL server address.

##

## Value: Port | IP:Port

##

## Examples: 3306, 127.0.0.1:3306, localhost:3306

auth.mysql.server = 127.0.0.1:3306

## MySQL pool size.

##

## Value: Number

auth.mysql.pool = 8

## MySQL username.

##

## Value: String

auth.mysql.username = root

## MySQL password.

##

## Value: String

auth.mysql.password = root

## MySQL database.

##

## Value: String

auth.mysql.database = mqtt

开启 mysql 认证插件

第一种方式:emqttd_ctl plugins load emq_auth_mysql

第二种方式:在 web 管理控制台中开启该插件

重启服务,使插件生效

三、测试

emqtt 的 mysql 插件默认开启 sha256 加密,其他加密方式如下图,其中 plain 表示明文不加密

此时我在数据库中配置了

username:admin

password:8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 (123456)

在项目中配置了

username:admin

password:123456

clientid: mqtt-client

topic: MQTT

此时我们再启动项目时,只有正确地配置了用户名和密码之后,才可以连接成功,否则会报异常

(当项目启动连接到 emqtt 服务时,emqtt 服务会自动将项目里配置的明文密码,使用 sha256 进行加密,然后与数据库中存储的密文进行比较,如果相等则连接成功,如果不相等则连接失败)

四、对密码进行加盐加密

所谓加盐,就是对明文密码前面或后面加上一个随机字符串,然后再对整个字符串进行加密,增强了密码的安全性

cd /usr/local/emqtt/emqttd/etc/plugins

vim emq_auth_mysql.conf

修改 mysql 查询语句和密码加密方式,保存并退出

## Authentication query.

##

## Note that column names should be 'password' and 'salt' (if used).

## In case column names differ in your DB - please use aliases,

## e.g. "my_column_name as password".

##

## Value: SQL

##

## Variables:

## - %u: username

## - %c: clientid

##

auth.mysql.auth_query = select password, salt from mqtt_user where username = '%u' limit 1

## auth.mysql.auth_query = select password_hash as password from mqtt_user where username = '%u' limit 1

## Password hash.

##

## Value: plain | md5 | sha | sha256 | bcrypt

## auth.mysql.password_hash = sha256

## sha256 with salt prefix

auth.mysql.password_hash = salt,sha256

重启服务,使配置生效

此处在 auth.mysql.auth_query 查询语句中,需要将 salt 也一并查出,并将加密方式 auth.mysql.password_hash 改为 salt,sha256 (例如:明文密码是 123456,salt 是 admin,则将 admin123456 使用 sha256 进行加密后,把得到的密文存储到数据库中)

salt,sha256:表示 salt 在前,明文密码在后,拼接成字符串后使用 sha256 进行加密

sha256,salt:表示明文密码在前,salt 在后,拼接成字符串后使用 sha256 进行加密

salt,sha256,salt:像这样明文密码前后都加 salt,我试了好多次,emqtt 并不支持

五、测试

此时我在数据库中配置了

username:admin

password:ac0e7d037817094e9e0b4441f9bae3209d67b02fa484917065f71b16109a1a78 (admin123456)

salt:admin

在项目中配置了

username:admin

password:123456

clientid: mqtt-client

topic: MQTT

此时我们再启动项目时,只有正确地配置了用户名和密码之后,才可以连接成功,否则会报异常

六、配置 mysql 权限控制

此外,我们可以对连接到 emqtt 的客户端进行进一步的控制 (权限控制),在这之前,我们还需要关闭默认鉴权行为

cd /usr/local/emqtt/emqttd/etc

vim emq.conf

找到 mqtt.acl_nomatch,将值改为 deny,保存并退出

## Default behaviour when ACL nomatch.

##

## Value: allow | deny

mqtt.acl_nomatch = deny

cd /usr/local/emqtt/emqttd/etc/plugins

vim emq_auth_mysql.conf

修改 mysql 鉴权查询语句,保存并退出

## ACL query.

##

## Value: SQL

##

## Variables:

## - %a: ipaddr

## - %u: username

## - %c: clientid

auth.mysql.acl_query = select allow, ipaddr, username, clientid, access, topic from mqtt_acl where username = '%u'

重启服务,使配置生效

此处根据自身的权限控制需求,修改 auth.mysql.acl_query 鉴权查询语句

username = ‘%u’:表示当前连接到emqtt服务的用户名

username = ‘$all’:表示所有连接到emqtt服务的用户名

七、测试

此时我在数据库中配置了

allow:1

ipaddr: 本地客户端IP地址

username:admin

clientid: mqtt-client

access: 1

topic: MQTT/#

在项目中配置了

username:admin

password:123456

clientid: mqtt-client

topic: MQTT

此时我们再启动项目时,只有正确地配置了用户名、密码、clientid、topic 之后 (根据鉴权查询语句来灵活配置),才可以连接成功,否则会报异常

八、启动超级用户

emqtt 的 mysql 插件还可以配置超级用户,超级用户可以跳过所有的访问控制,直接连接到 emqtt 服务

在数据库中直接将 is_superuser 字段设置为 1 即可

此时我在数据库中配置了

allow:1

ipaddr: 本地客户端IP地址

username:admin

clientid: mqtt-client

access: 1

topic: MQTT/#

is_superuser: 1

在项目中配置了

username:admin

password:123456

clientid: mqtt-client

topic: MQTT

此时我们再启动项目时,只要正确地配置了用户名和密码之后,就可以连接成功

例如:访问控制设置只能订阅 (access = 1),而本地服务器调用了发布 (access = 2) 的方法,因此理论上是发布不了的,而 admin 用户已经被设为了超级用户,所以就可以发布消息

emqtt mysql认证_Emqtt -- 05 -- Mysql插件认证及访问控制相关推荐

  1. Emqtt -- 05 -- Mysql插件认证及访问控制

    原文链接:Emqtt – 05 – Mysql插件认证及访问控制 相关文章: Emqtt – 01 – 服务搭建 Emqtt – 02 – 搭建本地项目 Emqtt – 03 – 用户密码认证 Emq ...

  2. emq+mysql设置_EMQ--添加mysql认证及mysql插件访问控制

    EMQ-百万级分布式开源物联网MQTT消息服务器. MQTT 认证设置 EMQ 消息服务器认证由一系列认证插件(Plugin)提供,系统支持按用户名密码.ClientID 或匿名认证. 系统默认开启匿 ...

  3. Mysql —— C语言链接mysql数据库,用户 角色 权限(用户根据角色的不同拥有增删改查的权限、用户有三种认证方式)

    db_修改过(用户 角色 权限): 1.新增用户时候id 改为最大id值加一,之前用的select查看出来的记录数加一,删除后再增加会出错: 2.删除用户时候,若该用户创建过其他用户(不能改此用户名. ...

  4. svn mysql认证_SVN基于MySQL认证

    SVN的简介和工作原理 Subversion(简称svn)是近几年崛起的版本管理软件,是cvs的接班人,目前绝大多数开源软件都使用svn作为代码版本管理软件.Subversion支持linux和win ...

  5. mysql 密码大小写_MySQL数据库加密和解密~认证登陆密码(mysql.user)和MySQL不区分大小写...

    MySQL数据库认证密码有两种方式: 1:MySQL 4.1版本之前是MySQL323加密 2:MySQL 4.1和之后的版本都是MySQLSHA1加密 还有函数:AES_ENCRYPT()加密函数和 ...

  6. linux mysql 6.0.4 启动_CentOS 6.0之MySQL+FreeRadiu实现帐号统一认证

    RADIUS:Remote Authentication Dial In User Service,远程用户拨号认证系统由RFC2865,RFC2866定义,是目前应用最广泛的AAA协议: RADIU ...

  7. httpd mysql认证_Apache Httpd服务器之认证与授权

    此篇文章,我们主要探讨下关于Httpd服务器的认证及授权. 所谓认证,在我的理解就是用户通过一个凭证进入服务器的过程,而授权是用户是否有权限获取服务器中的某个资源.认证负责的是整体,授权负责的是局部. ...

  8. MySQL数据库加密和解密~认证登陆密码(mysql.user)和MySQL不区分大小写

    MySQL数据库认证密码有两种方式: 1:MySQL 4.1版本之前是MySQL323加密 2:MySQL 4.1和之后的版本都是MySQLSHA1加密还有函数:AES_ENCRYPT()加密函数和A ...

  9. mysql squid_Linux 实现 squid+mysql认证

    作者:陶金 网名:imtj(www.chinaunix.com) 转载请保留上述信息 --------------------------------------------------------- ...

最新文章

  1. RabbitMQ 入门系列(9)— Python 的 pika 库常用函数及参数说明
  2. 图论 ---- 构造DFS树的思想 K - Boomerangs Gym - 102001K
  3. 在Linux上取得Windows上的文件
  4. java el jstl_java -EL技术JSTL技术
  5. Linux 关于动态链接库以及静态链接库的一些概念
  6. 设置ubuntu下使用ls命令显示文件颜色显示
  7. C# 事件详解附实例分析
  8. 大熊猫卸妆后_您不应错过的6大熊猫行动
  9. python问题解决了吗_Python 问题怎么解决?
  10. vue中父子组件先后渲染_Vue中父子组件执行的先后顺序
  11. access子窗体的控件vba怎么写_第37讲:VBA代码中运行错误的处理方式
  12. NUC1015 计算数字的根
  13. 类别的作用?继承和类别在实现中有何区别
  14. 鸿蒙系统操作界面跟苹果很像,华为鸿蒙系统的操作界面可能长这样 和安卓全完不同而且图标也太酷了...
  15. Shim特性是什么?
  16. .NET Core、DNX、DNU、DNVM、MVC6学习资料
  17. 中国智能互动纺织品市场趋势报告、技术动态创新及市场预测
  18. C# 屏蔽Ctrl Alt Del 快捷键方法+屏蔽所有输入
  19. 解析微信开发之搜索歌曲
  20. 数组----一维数组

热门文章

  1. idw matlab 程序_matlab小波变换程序
  2. 《惢客创业日记》2018.10.12(周五) 声音主播背后的“天龙八步”(一)
  3. 【20保研】国防科技大学计算机学院 2019年优秀大学生夏令营招生通知
  4. 可能与不可能的边界:P/NP问题趣史
  5. Lottie--前端动画效果--UI输出json格式--lottie动画在JavaScript中使用
  6. 背景透明css样式,CSS 背景(background)+背景透明(CSS3)
  7. 完成我的第一个java项目“评标人才库管理系统”——环境配置+创项目
  8. IBM ThinkPad 笔记本产品系列简介
  9. android操作系统的开发语言组成
  10. soc(三) 电源管理