Emqtt -- 07 -- HTTP插件认证及访问控制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Goodbye_Youth/article/details/88055674

最后我们来了解下 Http 插件认证以及访问控制,默认关闭了匿名认证及鉴权行为


一、搭建本地 http 访问控制项目

这里我用 IDEA 搭建了一个 SpringBoot 项目,SpringBoot 的版本是 2.1.1.RELEASE,整个项目最主要的就一个文件

  • MqttController

    /**
     * @Title: MqttController.java
     * @Description: MQ Controller层
     * @Author: xj
     * @Date: 2019/1/7 15:27
     */
    @RestController
    @RequestMapping(value = "/mqtt")
    public class MqttController {
    
        private static final Logger logger = LoggerFactory.getLogger(MqttController.class);
    
        /**
         * 授权请求
         *
         * @param clientid
         * @param username
         * @param password
         * @param response
         */
        @PostMapping(value = "/auth")
        public void auth(String clientid, String username, String password, HttpServletResponse response) {
            logger.info("clientid: " + clientid);
            logger.info("username: " + username);
            logger.info("password: " + password);
            // 处理自身的业务逻辑
            // ......
            response.setStatus(200);
        }
    
        /**
         * 超级用户请求
         *
         * @param clientid
         * @param username
         * @param response
         */
        @PostMapping(value = "/superuser")
        public void superuser(String clientid, String username, HttpServletResponse response) {
            logger.info("clientid: " + clientid);
            logger.info("username: " + username);
            // 处理自身的业务逻辑
            // ......
            response.setStatus(200);
        }
    
        /**
         * 鉴权请求
         * 
         * @param access
         * @param username
         * @param clientid
         * @param ipaddr
         * @param topic
         * @param response
         */
        @GetMapping(value = "/acl")
        public void acl(Short access, String username, String clientid, String ipaddr, String topic, HttpServletResponse response) {
            logger.info("access: " + access);
            logger.info("username: " + username);
            logger.info("clientid: " + clientid);
            logger.info("ipaddr: " + ipaddr);
            logger.info("topic: " + topic);
            // 处理自身的业务逻辑
            // ......
            response.setStatus(200);
        }
    }
    

项目开发完成后,将其打包部署到服务器上并运行


二、配置http认证

在 etc/plugins 目录下修改 emq_auth_http.conf 配置文件

  • cd /usr/local/emqtt/emqttd/etc/plugins

  • vim emq_auth_http.conf

  • 添加 http 连接配置,保存并退出

    ##--------------------------------------------------------------------
    ## HTTP Auth/ACL Plugin
    ##--------------------------------------------------------------------
    
    ##--------------------------------------------------------------------
    ## Authentication request.
    ##
    ## Variables:
    ##  - %u: username
    ##  - %c: clientid
    ##  - %a: ipaddress
    ##  - %P: password
    ##
    ## Value: URL
    auth.http.auth_req = http://127.0.0.1:8887/mqtt/auth
    ## Value: post | get | put
    auth.http.auth_req.method = post
    ## Value: Params
    auth.http.auth_req.params = clientid=%c,username=%u,password=%P
    
    ##--------------------------------------------------------------------
    ## Superuser request.
    ##
    ## Variables:
    ##  - %u: username
    ##  - %c: clientid
    ##  - %a: ipaddress
    ##
    ## Value: URL
    auth.http.super_req = http://127.0.0.1:8887/mqtt/superuser
    ## Value: post | get | put
    auth.http.super_req.method = post
    ## Value: Params
    auth.http.super_req.params = clientid=%c,username=%u
    
    ##--------------------------------------------------------------------
    ## ACL request.
    ##
    ## Variables:
    ##  - %A: 1 | 2, 1 = sub, 2 = pub
    ##  - %u: username
    ##  - %c: clientid
    ##  - %a: ipaddress
    ##  - %t: topic
    ##
    ## Value: URL
    auth.http.acl_req = http://127.0.0.1:8887/mqtt/acl
    ## Value: post | get | put
    auth.http.acl_req.method = get
    ## Value: Params
    auth.http.acl_req.params = access=%A,username=%u,clientid=%c,ipaddr=%a,topic=%t
    
  • 开启 redis 认证插件

    • 第一种方式:emqttd_ctl plugins load emq_auth_redis

    • 第二种方式:在 web 管理控制台中开启该插件

  • 重启服务,使插件生效

请求路由对应如下

  • auth.http.auth_req:对应授权请求

  • auth.http.super_req:对应超级用户请求

  • auth.http.acl_req:对应鉴权请求


三、测试

此时我们再启动项目时,emqtt 服务都会去请求这三个接口,通过返回的状态码来决定是否通过 (200 表示通过,不是 200 则表示不通过),此处我为了方便测试,将三个接口的返回状态码都设置为了 200,大家可以通过处理自己的业务逻辑来返回不同的状态码,从而灵活地实现 emqtt 的 HTTP 访问控制

猜你喜欢

转载自blog.csdn.net/Goodbye_Youth/article/details/88055674
07
今日推荐