EMQX v5.9.1 CONNECT http认证,获取不到 用户属性

EMQX v5.9.1 CONNECT http认证,获取不到 用户属性

参考官方文档

配置 emqx.conf:

mqtt {
client_attrs_init = [
{
expression = “user_property.aaaa”
set_as_attr = “a0”
}
]
}

控制台 菜单路径:访问控制 → 客户端认证 → http

请求体json:
{
“a0”: “${client_attrs.a0}”,
“a1”: “${user_property.aaaa}”,
“username”: “${username}”,
“password”: “${password}”
}

使用 MQTTX 客户端,连接的 用户属性 设置 aaaa = a123,然后点击“连接”

使用 java实现的 http服务端:

@PostMapping
public Resp connect(@RequestBody Map map) {
log.info(JSON.toJSONString(map));

打印出来的日志为:
{“username”:“junli”, “password”:“a”,“a0”:“${client_attrs.a0}”,“a1”: “${user_property.aaaa}”}

对应的占位符 ${client_attrs.a0},${user_property.aaaa} 都没被替换掉

${user_property.aaaa} 在 HTTP 认证请求模板里不会替换。这里要先把 CONNECT 里的 User-Property 提取成 client_attrs,再用 ${client_attrs.xxx}

mqtt {
  client_attrs_init = [
    {
      expression = "user_property.aaaa"
      set_as_attr = a0
    }
  ]
}

PS: 这个配置也可以 dashboard 上的 MQTT 上配置
HTTP 认证请求体建议只保留:

{
  "a0": "${client_attrs.a0}",
  "username": "${username}",
  "password": "${password}"
}

${user_property.aaaa} 不要直接放在认证请求体里。

改完后重连一次客户端,再看 HTTP 服务日志,a0 应该是实际值。
如果还不替换,贴这两段来看看:

  1. Dashboard 里 HTTP 认证器“请求体”的原文(复制文本,不截图)
  2. emqx ctl conf show mqtt 的输出

知道原因了,这个 占位符 里面的 前缀 必须是 client_attrs ,如果换成其他对象,会造成 client_attrs 对应的值也出不来

1 个赞