EMQ-发布订阅 ACL--HTTP ACL

使用http认证方式,方法如下
https://blog.csdn.net/qq_41712271/article/details/114309545
 

ACL 授权原理

EMQ X 在设备发布、订阅事件中使用当前客户端相关信息作为参数,向用户自定义的认证服务发起请求权限,通过返回的 HTTP 响应状态码 (HTTP statusCode) 来处理 ACL 授权请求。

  • 无权限:API 返回 4xx 状态码
  • 授权成功:API 返回 200 状态码
  • 忽略授权:API 返回 200 状态码且消息体 ignore


superuser 超级用户请求

首先查询客户端是否为超级用户,客户端为超级用户时将跳过 ACL 查询。

# etc/plugins/emqx_auth_http.conf

## 请求地址
auth.http.super_req = http://127.0.0.1:8991/mqtt/superuser

## HTTP 请求方法
## Value: post | get | put
auth.http.super_req.method = post

## 请求参数
auth.http.super_req.params = clientid=%c,username=%u

 

ACL 授权查询请求

# etc/plugins/emqx_auth_http.conf

## 请求地址
auth.http.acl_req = http://127.0.0.1:8991/mqtt/acl

## HTTP 请求方法
## Value: post | get | put
auth.http.acl_req.method = post

## 请求参数
auth.http.acl_req.params = access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t,mountpoint=%m

请求说明

HTTP 请求方法为 GET 时,请求参数将以 URL 查询字符串的形式传递;POST、PUT 请求则将请求参数以普通表单形式提交(content-type 为 x-www-form-urlencoded)。

你可以在认证请求中使用以下占位符,请求时 EMQ X 将自动填充为客户端信息:

  • %A:操作类型,'1' 订阅;'2' 发布
  • %u:客户端用户名
  • %c:Client ID
  • %a:客户端 IP 地址
  • %r:客户端接入协议
  • %m:Mountpoint
  • %t:主题

推荐使用 POST 与 PUT 方法,使用 GET 方法时明文密码可能会随 URL 被记录到传输过程中的服务器日志中。


根据上述配置中的url,参数等,编写springboot的代码

package cn.huawei.emq_http_authority.controller;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/mqtt")
class Controller_4 {

    private static final Logger logger  = LoggerFactory.getLogger(Controller_4.class);

    private Map<String,String> users=null;

    @PostConstruct
    public void Init()
    {
        users=new HashMap<>();
        users.put("haha1","123456");
        users.put("haha2","123456");
        users.put("haha3","123456");
        users.put("vipuser","123456");
    }

    @PostMapping("/superuser")
    public ResponseEntity Issuperuser(String clientid,String username)
    {
        if(!username.equals("vipuser"))
        {
            return new ResponseEntity(HttpStatus.UNAUTHORIZED) ;
        }
        return new ResponseEntity(HttpStatus.OK);
    }


    @PostMapping("/acl")
    public ResponseEntity aclPanduan(Integer access,String username,String clientid,String ipaddr,String topic,String mountpoint)
    {
       if(username.equals("haha1") && topic.equals("testtopic/#") && access==1)
        {
            logger.info("用户 {} 有权限订阅 {}",username,topic);
            return new ResponseEntity(HttpStatus.OK) ;
        }
        if(username.equals("haha2") && topic.equals("testtopic/123") && access==2)
        {
            logger.info("用户 {} 有权限发布 {}",username,topic);
            return new ResponseEntity(HttpStatus.OK) ;
        }
       logger.info("客户端 {} ,用户 {} ,没有权限对主题 {} 进行 {} 操作",clientid,username,topic,access==1?"订阅":"发布");
        return new ResponseEntity(HttpStatus.UNAUTHORIZED) ;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值