本文档介绍在 MQTT Dashboard 中创建 Password-Based 认证的操作步骤。
使用 MySQL 作为数据源时,请先确保以下事项:
相关注意事项,请参见注意事项。
参数 | 说明 |
---|---|
账号类型 | 指定客户端身份 ID 认证的字段,可根据业务需要选择 username 或 clientid。 |
密码加密方式 | 选择存储密码时使用的散列算法,如 plain、md5、sha、bcrypt、pbkdf2 等。
|
参数 | 说明 |
---|---|
服务 | 填写查询的 MySQL 实例的私网访问地址。 |
数据库 | 填写查询的数据库名称。 |
用户名 | 填写用户名。 注意 确保对应用户具备指定数据库的读写权限。 |
密码 | 填写密码。 |
启用 TLS | 配置是否启用 TLS 校验,以及是否校验服务器证书。如需校验,请分别配置 Cert 和 Key。 |
连接池大小 | 配置 MQTT 到指定 MySQL 数据库的并发连接数。默认值为 8,您可根据业务需求配置为其他整数值。 |
查询超时 | 指定连接超时等待时长。默认为 5 秒,您可根据业务需求配置为其他整数值,可选单位:毫秒、秒、分钟、小时。 |
密码加密方式 | 选择存储密码时使用的散列算法,如 plain、md5、sha、bcrypt、pbkdf2 等。 |
选择使用 plain、md5、sha、sha256、sha521 加密方式 | 加盐方式:用于指定盐和密码的组合方式,一般无需更改此选项。
|
选择使用 pbkdf2 加密方式 |
|
SQL | 根据表结构,填写查询 SQL 语句,具体要求请参见 SQL 表结构与查询语句。 |
MQTT 支持多种 MySQL 表结构、多个表结构联合查询,或者从视图中查询。您只需要提供一个查询的 SQL 模板,确保查询结果中包含以下字段:
字段 | 说明 |
---|---|
| 数据库中的明文或散列密码字段。 |
| 为空或不存在时视为空盐( |
| 标记当前客户端是否为超级用户,取值如下:
|
示例表结构
在指定数据库中创建如下表结构:
CREATE TABLE `mqtt_user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `username` varchar(100) DEFAULT NULL, `password_hash` 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;
说明
以上示例中创建了一个有助于查询的隐式 UNIQUE
索引字段( username
)。当系统中有大量用户时,请确保查询使用的表已优化并使用有效的索引,以提升大量连接时的数据查找速度并降低 MQTT 负载。
添加认证信息
在表 mqtt_user
中添加认证信息的示例如下:
认证信息:用户名为 mqtt_u1
,密码为 password0123
,盐值为 slat_foo123
,散列方式为 sha256
,超级用户标志为 true
mysql> INSERT INTO mqtt_user(username, password_hash, salt, is_superuser) VALUES ('mqtt_u1', SHA2(concat('password0123', 'slat_foo123'), 256), 'slat_foo123', 1); Query OK, 1 row affected (0,01 sec)
SQL 查询语句
以 {username}
作为查询条件,在表 mqtt_acl
中查询客户端认证信息的查询语句如下:
SELECT password_hash, salt, is_superuser FROM mqtt_user WHERE username = ${username} LIMIT 1