概述
EMQX 认证有多种方式:这里我们推荐使用 mysql认证方式
emqx-auth-mysql 插件简介
emqx_auth_mysql 是基于 MySQL 数据库的 MQTT 认证/访问控制插件,通过检查每个终端接入的 username
和 password
是否与用户指定的 MySQL 数据库中存储的信息一致性来实现对终端的连接认证和访问控制
# EMQX Broker 部署,版本为emqx/emqx:v4.0.0
docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:v4.0.0
1、生产环境中禁用匿名认证
# 进入容器,修改配置文件
$ docker exec -it emqx /bin/ash
$ vi etc/emqx.conf
# 配置匿名认证开关allow_anonymous 为false;acl_nomatch为deny
allow_anonymous = false
acl_nomatch = deny
2、MySQL 认证默认配置,需要确保数据库中有下表:
创建表:
- username:为客户端连接的时候指定的用户名;
- password:为使用 sha256 加密后的密文;
- salt:只是一个标识符,salt 与密码明文拼接然后加密,使密文安全性更高;
- is_superuser:是否为超级用户,用于控制 ACL,缺省为0;设置成 1 的时候为超级用户,可以跳过 ACL 检查;
数据表字段可以不用完全跟下面的一致,可以根据业务需要设置,通过 emqx_auth_mysql.conf
配置文件中的 auth_query
配置项来指定
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;
3、创建一个客户端连接用户
本文提供示例数据中密码为 public
,加密 salt 为 secret
,即客户端连接时使用的密码是 public
;
在 EMQX 的配置文件中 auth.mysql.password_hash
配置项:salt 只是一个标识符,表示 salt 与 密码明文的拼接关系;
- 如果采用
auth.mysql.password_hash = sha256,salt
,那么 EMQX 使用 SHA256 算法对publicsecret
字符串加密 - 如果采用
auth.mysql.password_hash = salt,sha256
,那么 EMQX 使用 SHA256 算法对secretpublic
字符串加密
本文采用第一种配置方式,将得到的 SHA256 密文插入表 mqtt_user
,读者可以通过 在线 SHA256 加密工具,对密码进行加密,然后插入数据库
sha256(publicsecret)= f1b51e91eb449e3db093f612bae0fc4e23c41945c5355a8164e35d6efd6f6e96
执行下面 sql语句,插入数据:
即客户端连接时使用的用户名emqx
密码是 public
进行连接
INSERT INTO `mqtt_user` ( `username`, `password`, `salt`)
VALUES
('emqx', 'f1b51e91eb449e3db093f612bae0fc4e23c41945c5355a8164e35d6efd6f6e96', 'secret');
4、EMQX启用 MySQL 认证,修改插件配置文件,并启用插件
要启用 MySQL 认证,需要在 etc/plugins/emqx_auth_mysql.conf
中配置以下内容:
$ docker exec -it emqx /bin/ash
$ vi etc/plugins/emqx_auth_mysql.conf
## 修改为实际 mysql 所在的服务器地址
auth.mysql.server = 127.0.0.1:3306
## 连接池大小
auth.mysql.pool = 8
## 数据库用户名
auth.mysql.username = root
## 数据库用户密码
auth.mysql.password = root
## 数据库名
auth.mysql.database = mqtt
auth.mysql.query_timeout = 5s
## 连接认证查询语句,,默认就这样,注释掉
auth.mysql.auth_query = select password from mqtt_user where username = '%u' limit 1
## 因为我们启用了加盐配置,查询字段中必须加上 salt,EMQX 使用该字段作为 salt(盐)值
auth.mysql.auth_query = select password, salt from mqtt_user where username = '%u' limit 1
## 加密算法 plain | md5 | sha | sha256 | bcrypt
## 加盐加密算法
auth.mysql.password_hash = sha256,salt
## 不加盐加密算法,直接写算法名称即可,默认就这样,注释掉
## auth.mysql.password_hash = sha256
重新启动emqx
docker restart emqx
5、登录 Dashboard,启动emqx-auth-mysql 插件
http://localhost:18083
用户名: admin
密 码: public
6、客户端连接测试:
代码中初始化mqtt时增加两个参数
// createMQTTClient 初始化MQTT客户端
func createMQTTClient() (MQTT.Client, error) {
// 初始化MQTT客户端选项
clientOptions := MQTT.NewClientOptions()
clientOptions.AddBroker(global.MqttBrokerURI)
clientOptions.OnConnect = onConnectHandler
clientOptions.OnConnectionLost = onConnectLostHandler
clientOptions.SetClientID("cloud_data_process")
# 增加下面两个参数,才能连接成功
clientOptions.SetUsername("emqx")
clientOptions.SetPassword("public")
// 创建MQTT客户端并连接到Broker
mqttClient := MQTT.NewClient(clientOptions)
if token := mqttClient.Connect(); token.Wait() && token.Error() != nil {
return nil, token.Error()
}
return mqttClient, nil
}
最后
以上就是生动酒窝为你收集整理的EMQX开启权限认证,连接请求时,决定客户端是否允许连接Broker的全部内容,希望文章能够帮你解决EMQX开启权限认证,连接请求时,决定客户端是否允许连接Broker所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复