EMQX-Go 现在支持通过配置文件来管理用户认证。您可以使用 YAML 或 JSON 格式的配置文件来添加、修改和管理 MQTT 用户。
broker:
node_id: "emqx-go-node"
mqtt_port: ":1883"
grpc_port: ":8081"
metrics_port: ":8082"
auth:
enabled: true
users:
- username: "admin"
password: "admin123"
algorithm: "bcrypt" # bcrypt, sha256, 或 plain
enabled: true
- username: "user1"
password: "password123"
algorithm: "sha256"
enabled: true
- username: "guest"
password: "guest123"
algorithm: "sha256"
enabled: false # 禁用用户{
"broker": {
"node_id": "emqx-go-node",
"mqtt_port": ":1883",
"grpc_port": ":8081",
"metrics_port": ":8082",
"auth": {
"enabled": true,
"users": [
{
"username": "admin",
"password": "admin123",
"algorithm": "bcrypt",
"enabled": true
}
]
}
}
}# 使用 YAML 配置文件
./bin/emqx-go -config=config.yaml
# 使用 JSON 配置文件
./bin/emqx-go -config=config.json
# 不指定配置文件(使用默认配置)
./bin/emqx-go# 生成 YAML 配置文件
./bin/emqx-go -generate-config=my-config.yaml
# 生成 JSON 配置文件
./bin/emqx-go -generate-config=my-config.jsonEMQX-Go 提供了专门的 CLI 工具来管理用户,无需手动编辑配置文件。
go build -o bin/emqx-user ./cmd/emqx-user./bin/emqx-user -cmd=list -config=config.yaml输出示例:
USERNAME ALGORITHM ENABLED PASSWORD
-------- --------- ------- --------
admin bcrypt ✓ ad****23
user1 sha256 ✓ pass****d123
guest sha256 ✗ gu****23
# 添加用户(默认启用,使用 bcrypt 加密)
./bin/emqx-user -cmd=add -user=newuser -pass=mypassword -config=config.yaml
# 指定加密算法
./bin/emqx-user -cmd=add -user=device001 -pass=secret123 -algo=sha256 -config=config.yaml
# 添加但默认禁用的用户
./bin/emqx-user -cmd=add -user=testuser -pass=testpass -enabled=false -config=config.yaml# 更新密码
./bin/emqx-user -cmd=update -user=admin -pass=newpassword -config=config.yaml
# 更新密码和加密算法
./bin/emqx-user -cmd=update -user=user1 -pass=newpass -algo=bcrypt -config=config.yaml# 禁用用户
./bin/emqx-user -cmd=disable -user=guest -config=config.yaml
# 启用用户
./bin/emqx-user -cmd=enable -user=guest -config=config.yaml./bin/emqx-user -cmd=remove -user=olduser -config=config.yaml./bin/emqx-user -cmd=generate -config=new-config.yamlEMQX-Go 支持三种密码加密算法:
- 优点: 最安全,自带盐值,抗彩虹表攻击
- 缺点: 计算密集,速度较慢
- 使用场景: 生产环境,管理员账户
- username: "admin"
password: "admin123"
algorithm: "bcrypt"- 优点: 计算快速,安全性好
- 缺点: 需要盐值防止彩虹表攻击
- 使用场景: 大量IoT设备认证
- username: "device001"
password: "device_secret"
algorithm: "sha256"- 优点: 明文存储,便于调试
- 缺点: 完全不安全
- 使用场景: 仅限开发和测试环境
- username: "test"
password: "test"
algorithm: "plain"auth:
enabled: false # 完全禁用认证,允许匿名连接users:
- username: "admin"
password: "admin123"
algorithm: "bcrypt"
enabled: false # 禁用此用户,拒绝连接broker:
node_id: "iot-gateway-01"
mqtt_port: ":1883"
auth:
enabled: true
users:
# 管理员账户
- username: "admin"
password: "secure_admin_password"
algorithm: "bcrypt"
enabled: true
# IoT 设备账户
- username: "sensor_001"
password: "sensor_secret_key_001"
algorithm: "sha256"
enabled: true
- username: "actuator_001"
password: "actuator_secret_key_001"
algorithm: "sha256"
enabled: true
# 应用程序账户
- username: "app_backend"
password: "backend_service_key"
algorithm: "bcrypt"
enabled: true
# 临时禁用的设备
- username: "sensor_002"
password: "sensor_secret_key_002"
algorithm: "sha256"
enabled: falsebroker:
node_id: "test-broker"
mqtt_port: ":1883"
auth:
enabled: true
users:
- username: "test"
password: "test"
algorithm: "plain"
enabled: true
- username: "demo"
password: "demo123"
algorithm: "plain"
enabled: true错误: Failed to parse config file: yaml: unmarshal errors
解决: 检查 YAML 缩进是否正确,确保使用空格而不是制表符。
排查步骤:
- 检查用户是否存在:
./bin/emqx-user -cmd=list - 检查用户是否启用:查看
enabled字段 - 检查密码是否正确
- 查看服务器日志中的认证信息
错误: Failed to read config file: permission denied
解决: 确保配置文件有正确的读取权限:
chmod 644 config.yaml目前需要重启服务来加载新配置:
# 停止服务 (Ctrl+C)
# 重新启动
./bin/emqx-go -config=config.yaml- 生产环境: 使用
bcrypt算法 - 密码强度: 使用复杂密码,至少 12 位字符
- 配置文件权限: 设置适当的文件权限 (644 或 600)
- 定期更新: 定期更新用户密码
- 禁用测试账户: 生产环境中禁用或删除测试用户
- 监控日志: 定期检查认证失败日志
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.username_pw_set("admin", "admin123")
client.connect("localhost", 1883, 60)
client.publish("test/topic", "Hello EMQX-Go")opts := mqtt.NewClientOptions()
opts.AddBroker("tcp://localhost:1883")
opts.SetUsername("admin")
opts.SetPassword("admin123")
opts.SetClientID("go-client")
client := mqtt.NewClient(opts)
token := client.Connect()# 发布消息
mosquitto_pub -h localhost -p 1883 -u admin -P admin123 -t test/topic -m "Hello"
# 订阅消息
mosquitto_sub -h localhost -p 1883 -u admin -P admin123 -t test/topic