版权声明:本文为博主原创文章,未经博主允许不得转载。 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 访问控制