上一篇随笔我简单的记录了我对EMQ插件开发的了解过程,最后发现还是可以组合复用已有插件,因此这篇随笔用于记录使用的情况以及是否达到预期。

首先测试mysql认证插件的使用方式:

emqx_auth_mysql

根据readme,使用该插件需要先在数据库上运行它们的sql脚本,在docker中完成这一步可以参考这篇文章

主要的思想是,在Dockerfile中先用环境变量设置免密登录,然后执行各个sql脚本(创建数据库,数据表,插入数据),最后一个脚本创建用户,设置权限和密码。

将该插件的sql脚本执行后顺便插入一个测试用的用户:

INSERT INTO mqtt_user ( username,password )
VALUES
( "device1","device1" ); INSERT INTO mqtt_acl ( allow,username,access,topic )
VALUES
( 1,"device1",1,"a" ),
( 0,"device1",2,"a" ),
( 1,"device1",3,"b" );

根据插件的源码,它会根据用户名查询数据库,一共有六种可能:

  1. 数据库存在该用户,密码未加盐:
    1. 密码正确,返回ok
    2. 密码错误,返回error
  2. 数据库存在该用户,密码加盐:
    1. 密码正确,返回ok
    2. 密码错误,返回error
  3. 数据库不存在该用户,返回ignore(即沉默,交给其他插件处理,如果没有其他插件,则会同意)
  4. 查询错误(数据库连接失败),此时不通过任何请求(但是数据库连接失败时无法启动插件,这种情况只会出现在建立连接后数据库断开的情况)

emqx_auth_http

这个插件同样可以支持普通用户认证,超级用户认证和访问权限控制,只需填写对应服务的http接口即可,传输的内容都放在http包的body中(如果设置为post的话)或者url中(如果设置为get的话),收到的结果根据状态码和body分类,一共四种:

  1. 返回状态码200,但是body为"ignore",此时行为为ignore;
  2. 返回状态码200,body不是“ignore”,此时行为为ok;
  3. 返回状态码非200,此时行为为error;
  4. http请求失败,此时返回error,不同意任何连接

另外还有超级用户认证和访问权限控制,他们都遵守以下规则:

  1. 同意:状态码200
  2. 否决:状态码非200
  3. 交给其他插件处理:状态码200,body为“ignore”

比较麻烦的一点是这两个功能是关不掉的,因此如果不想使用该插件管理访问权限和超级用户认证,那就需要返回200和ignore

需求逻辑整理

目前的需求是,客户端的密码是加密过的,而且是需要认证服务器获得之后验证的,因此无法提前保存在数据库,因此,mysql中不能保存相关用户的密码。

根据这两个插件的行为,排除连接失败和合并两种数据库的密码验证后,可以组合出9种行为,每种行为后方标记分别为:理论行为,需求行为

  • mysql中有相关用户

    • mysql验证通过

      • http验证通过: ok,ok
      • http验证失败: error,error
      • http验证忽视: ok,ok
    • mysql验证失败
      • http验证通过: ok,ok
      • http验证失败: error,error
      • http验证忽视: error,error
  • mysql中没有相关用户
    • http验证通过: ok,ok
    • http验证失败: error,error
    • http验证忽视: ignore,ignore

经过列举,我发现当mysql不保存用户时,这两个插件的行为完全符合我的需求,因此完全可以使用这两个插件的组合来完成平台的认证和权限控制。其中mysql只负责权限控制,ignore用户登录,而http认证服务器只负责用户登录,ignore权限控制。

emqx_web_hook

webhook的概念很简单,就是在各类hook点给预设的API发送数据,用以动态监控指定动作。这跟CPU上的调试用的埋点非常类似,GDB就是用这种思想监控程序的执行过程。

emq的webhook插件使用很简单,只需要设置API的URL,再勾选要监控的动作即可,它硬编码了要发送的格式,即在Body中发送json格式的文本,json中的内容也根据action硬编码,无法配置,目前我们可以适应该接口,如果有需求,可以将其改成可配置的软接口,也可以直接更改硬编码的接口。

最新文章

  1. C++多继承的观察和7点体会(都是实用派的观点) good
  2. 用Unitils测试BaseDao遇到的问题总结
  3. HashMap加入数据后,会自动根据首字母排序
  4. 深入了解Json转变为map的思想,附源代码2
  5. jmeter测试dubbo接口
  6. 盒子取球C语言 蓝桥杯
  7. Redis订阅与发布
  8. 一起学python-语法
  9. js实现选中div内容并复制到剪切板
  10. 剑指offer(14)
  11. Web版记账本开发记录(三)
  12. 野(wild)指针与悬空(dangling)指针
  13. SE Springer小组之《Spring音乐播放器》可行性研究报告五、六
  14. Selenium自动化Page模式(Python)
  15. (16)JavaScript的流程控制(js的循环)
  16. HDOJ 2013 蟠桃记
  17. 基于spring boot 2.x 的 spring-cloud-admin 实践
  18. [UE4]事件处理(Handling Events)和委托(Delegate)代码示例(二)【C++】
  19. NetCore入门篇:(二)Net Core项目创建
  20. 系统架构--分布式计算系统spark学习(三)

热门文章

  1. Linux 的帐号与群组:有效与初始群组、groups, newgrp
  2. EfficientNet学习笔记
  3. Windows 10安装Python 2.7和MySQL-python
  4. springmvc框架中的核心对象DispatcherServlet
  5. IIS7设置限制IP地址访问
  6. plsql之导入数据乱码
  7. hdu1864最大报销额 01
  8. C#基础进阶
  9. phpMyAdmin无法缓存模板文件,所以会运行缓慢。
  10. BZOJ1787 [Ahoi2008]Meet 紧急集合[结论题]