前言
在 Emqx v4.x
版本,使用外部 http
做 ACL
访问控制是通过插件的形式来实现的。到了 v5.x
的版本,将其内置了,并且将连接认证和授权区分开来,拆分成访问控制——> 认证和访问控制——>授权两个部分。
配置
打开 18083
后台管理页面,选择左侧菜单访问控制——>授权,点击右上角的 创建
按钮,数据源选择 HTTP Server
。
点击下一步按钮,开始配置 HTTP Server
的参数。 HTTP
的请求方式最好使用POST
,其余配置很简单,见文知意,这里主要介绍 Body
配置。默认的 Body
配置如下所示:
{ "username": "${username}" }点击复制复制失败已复制
其中 ${username}
为插值内容,所有可选的插值如下所示:
插值 | 字段 | 含义 |
${clientid} |
clientid |
mqtt 客户端连接 emqx 时填写的 clientid 内容 |
${username} |
用户名 | mqtt 客户端连接 emqx 时填写的 username 内容 |
${peerhost} |
客户端的源 IP 地址 |
|
${mountpoint} |
网关监听器的挂载点(主题前缀) | 还没搞明白,拿到的都是空字符串 |
${topic} |
mqtt主题 | 当前请求想要发布或订阅的主题(或主题过滤器) |
${action} |
当前执行的动作请求 | publish 或 subscribe |
在授权判定的时候,选择需要的字段都发送给授权服务,全部字段的 Body
配置如下所示:
{ "clientid": "${clientid}", "username": "${username}", "peerhost": "${peerhost}", "mountpoint": "${mountpoint}", "topic": "${topic}", "action": "${action}" }点击复制复制失败已复制
服务器处理
如果授权成功,那么 HTTP
的返回状态码一定是 200
或 204
,其余状态码均认为是认证失败。
其中,如果状态码是 204
,则表示允许此次发布/订阅请求,不去验证返回内容。如果状态码是 200
,则去验证返回内容,返回内容必须是 json
格式,里面只有一个字段: result
,其可选值如下所示:
可选值 | 含义 |
allow |
允许此次发布/订阅 |
deny |
拒绝此次发布/订阅 |
ignore |
忽略本次请求,把它移交给下一个 Authorizer 处理 |