我是靠谱客的博主 生动酒窝,最近开发中收集的这篇文章主要介绍EMQX开启权限认证,连接请求时,决定客户端是否允许连接Broker,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

EMQX 认证有多种方式:这里我们推荐使用 mysql认证方式

emqx-auth-mysql 插件简介

emqx_auth_mysql 是基于 MySQL 数据库的 MQTT 认证/访问控制插件,通过检查每个终端接入的 usernamepassword 是否与用户指定的 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客户端
代码中初始化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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(110)

评论列表共有 0 条评论

立即
投稿
返回
顶部