EMQX + redis怎么设置同时验证username和clientid

配置客户端认证时,dashboard里面的命令是: HMGET mqtt_user:${username} password_hash salt

如果我想加一个clientid的验证(即username通过密码验证,clientid验证这个设备是否存在), 这个命令如何设置。 设计是一个username对应多个clientid,即一个账号下多个设备。

与此同时,redis对应记录怎么设置。谢谢!

试试:HMGET mqtt_user:${username} password ${clientid}

会报错的:
400 BAD_REQUEST: {exception,{error,{badmap,{unsupported_fields,[“${clientid}”]}},[{emqx_authn_redis,update,2,[{file,“emqx_authn_redis.erl”},{line,142}]},{emqx_authentication,handle_update_authenticator,3,[{file,“emqx_authentication.erl”},{line,566}]},{emqx_authentication,do_with_chain,2,[{file,“emqx_authentication.erl”},{line,873}]},{emqx_authentication,handle_call,3,[{file,“emqx_authentication.erl”},{line,490}]},{gen_server,try_handle_call,4,[{file,“gen_server.erl”},{line,1149}]},{gen_server,handle_msg,6,[{file,“gen_server.erl”},{line,1178}]},{proc_lib,init_p_do_apply,3,[{file,“proc_lib.erl”},{line,240}]}]}}

你redis是怎么存的,截个图扣扣

您好, 我一开始的 redis是这样的:
HMSET mqtt_user:emqx_u1 password_hash xxxx salt xxxxxxx
在dashboard(EMQX开源版)里面的redis命令设置是:
HMGET mqtt_user:${username} password_hash salt
在客户端用emqx_u1账号登陆成功的。

上面的配置,我只用了username参数,没有用clientid, 现在想把clientid加上去
按照您的提示 HMGET mqtt_user:${username} password_hash salt ${clientid},就报错了。
这里应该和redis无关,因为我已经把这条redis删


首先 unsupported_fields 错误是因为现在 redis 认证不支持 clientid 这个占位符。目前支持的占位符有 4 个:${password_hash}, ${password}, ${salt}, ${is_superuser}。

我可以问问产品有没有可能支持这个 clientid 占位符。

你现在可以尝试同时使用 redis 认证 + 内置认证来实现你的功能,Dashboard 界面上选择 Access Control - Authentication - Password-Based - Built-in Database, 然后选择 clientid。需要你预先往内置认证里添加数据:

学习了。

谢谢回复。那这样的话, 我需要同时开启 redis认证 和 内置认证了,如图

然后在内置数据库里面配置

redis认证的是username,而内置认证的是clientid。 clientid一般对应的是设备编号,我如果设计成:为每一个username对应N个clientid的话,那是不是这一批clientid用的就是和对应的username一样的salt和password

另外我在内置认证里面用csv上传,报错了 400 BAD_REQUEST: bad_format
文件是用的模板,填了一批设备用的同样的密码和salt
emqx4

内置认证用了md5加密,加盐方式prefix, 和redis认证一样

@Shawn 节日快乐。 有空帮我看看上传csv的问题,谢谢。

我抄了一下你的 csv 文件,点击上传没有发现问题,我使用的 emqx 5.2.1。文件:

myusers.csv.zip (648 字节)

我用notepad打开您的myuser.csv文件,发现最后一列is_superuser都是小写的false, 不知道为什么我自己编辑以后都是大写FALSE了, 必须小写才能上传成功。

另外这里编辑只能改密码,不能改salt?
emqx

  • 必须为小写的 truefalse
  • salt 会在添加/更新用户时重新随机生成,不能手动更改

这里我是打算对设备进行验证的,如果我想批量删除某个厂家的一批设备呢, 几百上千个,一一手工删除实在不太方便,该如何操作呢?
谢谢。

您好。您可以考虑使用api删除多个设备。

您好,请问下开源版支持REST API嘛

支持的。您可以在您所使用的EMQX版本文档页面的搜索框中输入rest api, 然后查看相应的文档。

谢谢。

你现在可以尝试同时使用 redis 认证 + 内置认证来实现你的功能,Dashboard 界面上选择 Access Control - Authentication - Password-Based - Built-in Database, 然后选择 clientid。需要你预先往内置认证里添加数据 ————》 如果客户端上传了 username + password + clientid,那么就是用redis验证一遍username + password, 然后内置认证再做一遍clientid + password, 用同一个密码,是这样嘛? 开启多个认证的话,哪一个先执行是否按照客户端认证里面多种方式的次序。

您好。我重新描述一下您的需求,您看对不对

  1. 通过username/password进行设备连接的身份认证
  2. 设备通过身份认证后,验证设备的clientid是否存在,如果存在连接成功,不存在连接失败

如果您的需求如上所述,使用认证链无法满足。认证链的逻辑是设备先经过第一个认证模块进行身份认证,如果认证成功就会连接成功,不会继续进行后续的认证。
您可以考虑使用Redis进行username/password的身份认证,然后通过授权使不允许的clientid断开连接。这样会连接再断开,不知道是否能满足需求。