mosquitto安装mysql插件 进行权限认证

2023-11-13

简介

因工作中需要对接物联网设备,设备数据的上传和下发都需要不同的连接账号作为topic。因此采用mqtt+mysql的方式,动态的维护mqtt的账号。

一、安装依赖

yum install openssl-devel
yum install gcc-c++
yum install mysql-devel

rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

二、下载压缩包

下载安装包到 /home/mosquitto/
mosquitto下载(1.6.10)
mosquitto-auth-plug下载

三、安装mosquitto

cd /home/mosquitto/
tar -zxvf  mosquitto-1.6.10.tar.gz
cd /mosquitto-1.6.10
make

mosquitto安装完毕

四、安装mosquitto-auth-plug-master

cd ..
cd /mosquitto-auth-plug-master
make

报错:
在这里插入图片描述
由于auth-plug.c文件中格式错误,将const 删掉,如下

vim  auth-plug.c

在这里插入图片描述
继续执行make
报错:
在这里插入图片描述

sudo ln -sf /home/mosquitto/mosquitto-1.6.10/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
sudo ln -s /usr/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so
sudo ldconfig

再执行make,成功。生成auth-plug.so文件
在这里插入图片描述

五、配置mosquitto配置文件

auth-plug.so移至mosquitto下

mv auth-plug.so  /home/mosquitto/mosquitto-1.6.10

备份原有的mosquitto.conf,将mosquitto-mysql.conf文件移动到mosquitto目录下

cd /home/mosquitto/mosquitto-1.6.10
mv mosquitto.conf mosquitto.conf.tmp
mv /home/mosquitto/mosquitto-auth-plug-master/mosquitto-mysql.conf  mosquitto.conf

编辑配置文件,修改如下所示

vim  mosquitto.conf

完整配置文件如下:

autosave_interval 1800
persistence true
persistence_file mosquitto.db
persistence_location /tmp/
connection_messages true
log_timestamp true
log_dest stderr

#log_type error
#log_type warning
#log_type notice
#log_type information
#log_type all
log_type debug

listener 1883 # mqtt端口号


#
#   __  __       ____   ___  _     
#  |  \/  |_   _/ ___| / _ \| |    
#  | |\/| | | | \___ \| | | | |    
#  | |  | | |_| |___) | |_| | |___ 
#  |_|  |_|\__, |____/ \__\_\_____|
#          |___/                   
#  
#                     

auth_plugin /home/mosquitto/mosquitto-1.6.10/auth-plug.so  # auth-plug.so 文件所在位置
auth_opt_backends mysql
auth_opt_host 192.168.3.122    # mysql的ip
auth_opt_port 3306             # mysql的端口
auth_opt_dbname mosquitto      # mysql的数据库名
auth_opt_user root             # mysql的用户名
auth_opt_pass xxxxxxxxxxx      # mysql的密码
auth_opt_userquery SELECT pw FROM users WHERE username = '%s'  # 认证
auth_opt_superquery SELECT IFNULL(COUNT(*), 0) FROM users WHERE username = '%s' AND super = 1 #是否是超级用户
auth_opt_aclquery SELECT topic FROM acls WHERE username = '%s' AND (rw >= %d)   #查询权限
auth_opt_superusers S*
user root

六、数据库管理

根据上方的mysql配置,创建数据库
examples文件中获取创建表的sql
在这里插入图片描述
也可直接复制下方创建sql

DROP TABLE IF EXISTS users;

CREATE TABLE users (
	id INTEGER AUTO_INCREMENT,
	username VARCHAR(25) NOT NULL,
	pw VARCHAR(128) NOT NULL,
	super INT(1) NOT NULL DEFAULT 0,  -- 0:普通用户,1:超级用户
	PRIMARY KEY (id)
  );

CREATE UNIQUE INDEX users_username ON users (username);

DROP TABLE IF EXISTS acls;

CREATE TABLE acls (
	id INTEGER AUTO_INCREMENT,
	username VARCHAR(25) NOT NULL,
	topic VARCHAR(256) NOT NULL,
	rw INTEGER(1) NOT NULL DEFAULT 1,	-- 1: 只读, 2: 读写
	PRIMARY KEY (id)
	);
CREATE UNIQUE INDEX acls_user_topic ON acls (username, topic(228));

添加测试数据,使用np指令生成加密密码
在这里插入图片描述
如上输入两次密码,生成密码后将密码复制到数据库users表中
在这里插入图片描述
super等于1 标识超级用户
在这里插入图片描述
rw等于2 标识读和写权限. 1–只读
/#通配符,标识所有的topic

测试连接
在这里插入图片描述
连接成功,超级用户看到系统topic
在这里插入图片描述
到此就可以动态的管理mqtt的用户啦

七、java加密 密码工具类

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * @author gongl
 * @date 2023-02-24
 */

public class MosquittoPBKDF2 {
    private static final int KEY_LENGTH = 24 * 8;
    private static final int SALT_LENGTH = 12;
    private static final int ITERATIONS = 901;

    public static String createPassword(String plainPassword) {
        byte[]  someBytes= new byte[MosquittoPBKDF2.SALT_LENGTH];
        Random randomGenerator = new Random();
        randomGenerator.nextBytes(someBytes);
        String encodedSalt = Base64.getEncoder().encodeToString(someBytes);

        SecretKeyFactory f = null;
        try {
            f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(MosquittoPBKDF2.class.getName()).log(Level.SEVERE, null, ex);
        }
        KeySpec ks = new PBEKeySpec(plainPassword.toCharArray(), encodedSalt.getBytes(), MosquittoPBKDF2.ITERATIONS, MosquittoPBKDF2.KEY_LENGTH);
        SecretKey s;
        try {
            s = f.generateSecret(ks);
            String encodedKey = Base64.getEncoder().encodeToString(s.getEncoded());
            return "PBKDF2$sha256$" + MosquittoPBKDF2.ITERATIONS + "$" + encodedSalt + "$" + encodedKey;
        } catch (InvalidKeySpecException ex) {
            Logger.getLogger(MosquittoPBKDF2.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "";
    }

    public static boolean isValidPassword(String plainPassword, String hashedPasword) {
        String[] encodedPassword = hashedPasword.split("\\$");
        int encodedIterations = Integer.parseInt(encodedPassword[2]);
        byte[] encodedSalt = encodedPassword[3].getBytes(StandardCharsets.UTF_8);
        String encodedHash = encodedPassword[4];
        SecretKeyFactory f = null;
        try {
            f = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
        } catch (NoSuchAlgorithmException e) {
            System.out.println("Need a Java implementation with cryptography.");
        }
        KeySpec ks = new PBEKeySpec(plainPassword.toCharArray(), encodedSalt, encodedIterations, MosquittoPBKDF2.KEY_LENGTH);
        SecretKey s = null;
        try {
            s = f.generateSecret(ks);
        } catch (InvalidKeySpecException e) {
            System.out.println("Encoded password is corrupt.");
        }
        return encodedHash.equals(Base64.getEncoder().encodeToString(s.getEncoded()));
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mosquitto安装mysql插件 进行权限认证 的相关文章

随机推荐

  • vue+element锚点跳转+自动感应导航栏

    最近来个需求 要做一个页面 每个模块都是百分百全屏且右侧有个导航栏能自动感应在哪个模块 点击也能直接跳转到该锚点 其实难点也就那几个 慢慢捋一下就好 话不多说上代码 1 锚点跳转且点击哪个会模块右侧导航栏就会高亮 我这个导航栏是因为未来增加
  • 警惕免杀版Gh0st木马!

    https github com SecurityNo1 Gh0st2023 经过调查发现 这款开源的高度免杀版Gh0st木马目前正在大范围传播 据称可免杀多种主流杀软 开发者不仅制作了新颖的下载页面 还设法增加了搜索引擎的收录权重 吸引了
  • 【机器学习】14、sklearn

    文章目录 一 机器学习概览 二 分类 2 1 二分类器 2 多分类器 2 3 误差分析 三 训练模型 3 1 线性回归和逻辑回归 3 2 逻辑回归 3 3 softmax回归 练习题4 四 SVM 练习题5 五 决策树 练习题6 六 集成学
  • 微信小程序嵌套的H5使用小程序分享(分享微信好友或朋友圈)

    需求说明 嵌套在微信小程序中的H5想要使用小程序自带分享功能 分享H5的页面给微信好友或朋友圈 实现原理 H5中可使用wx miniProgram postMessage向小程序的webview发送消息 会触发组件的message事件 在小
  • kvm-ovirt-vdsm安装记录

    小技巧 1 fedaro 19自动查找最快yum源 yum install yum fastestmirror 2 libvirt启动sasl添加用户 saslpasswd2 c a libvirt admin 3 查看kvm模块 lsmo
  • 第十三届蓝桥杯A组Python组心得分享

    第一次写心得类的文章 趁着假期有时间 记录一下在准备这个比赛间的一些心得和一些问题的思路 前面是碎碎念 直接看问题解决思路的可以跳到后面 先说情况 省一 小题对了第一个 大题写出来了五个 不确定是否全部AC 认真准备这个比赛的时间不超过一周
  • 【今日CV 计算机视觉论文速览】Wed, 13 Mar 2019

    今日CS CV计算机视觉论文速览 Wed 13 Mar 2019 Totally 25 papers Interesting 自动医学图像分析 主要就x光乳腺癌检测 胸片CT肺结合检测 脑部颈部病变检测等方面展开研究 并阐述了如何生成数据
  • iOS左对齐自动换行collection样式

    前言 想必大家工作中或多或少会遇到下图样式的UI需求吧 像这种cell长度不固定 以此向右对齐排列的样式UI可以说是很常见的 实现方式 一般的实现可能主要是分一下两种 1 一种是用button依次排列实现 动态计算text宽度 记录之前一个
  • Ruby on Rails emoji表情通过json返回

    原因 大概意思是 emoji表情是5位字符 而to json as json最多支持4个字符 导致返回的emoji不完整 客户端就不会识别 导致乱码 解决方法 在config initializers文件夹下新建patches rb 文件
  • 【项目复盘React】react封装动态组件+组件懒加载(hook版)

    使用到的hook useContext 使用到的api lazy React 1 在utils文件夹下新建文件夹testContext 2 新建文件PersonContext js 导出一个Context对象实例 import React
  • 射频原理图设计checklist

    射频原理图设计checklist 持续更新 文章目录 射频原理图设计checklist 1 WiFi GPS测试兼容 2 SAR SENSER 的GPIO控制和电源供电需常开 3 射频收发器与基带芯片之间的IQ连接线需参考平台推荐 4 主集
  • WEB靶场系类搭建

    环境 windwos centos ubuntu DVWA 1 进 phpmyadmin创建dvwa数据库 2 修改配置文件 3 输入127 0 0 1 dvwa 安装 pikachu 1 直接修改配置文件 2 127 0 0 1 pika
  • js实现瀑布流布局

    实现思路是 收集列表元素数组 每列定宽不定高 列表元素全部相对于容器元素绝对定位 根据容器可视宽度计算每行的元素盛放个数 根据盛放个数先处理第一行 依次排列在第一行 处理后续元素 维护一个每列当前高度的数组 对于后续行的元素 依次往当前最低
  • 每日一库之Go 强大而灵活的电子邮件库:email

    发送邮件是一个很常见的需求 用户邮箱验证 邮箱召回等 Go 语言标准库自带 net smtp 库 实现了 smtp 协议 用于发送邮件 然而这个库比较原始 使用不方便 而且官方声明不再增加新功能 于是乎出现了一些强大的第三方邮件库 今天推荐
  • PSD 格式文件除了 PS ,还能用什么软件打开?

    有人问 除了 Photoshop 还有哪些软件能打开 PSD 格式文件呢 当我看到这个问题时 我立刻理解了他的烦恼 因为有段时间 我的电脑里没有安装 Photoshop 但有一次 我的同事发了一个 PSD 文件给我 我却无法联系到他 我急需
  • linux(centos7) 查看剩余磁盘空间大小

    df hl 查看磁盘剩余空间 df h 查看每个根路径的分区大小 du sh 目录名 返回该目录的大小 du sm 文件夹 返回该文件夹总M数 du h 目录名 查看指定文件夹下的所有文件大小 包含子文件夹 查看硬盘的分区 sudo fdi
  • 非方阵点乘算法

    非方阵点乘算法 基于 lt 算法4 gt 中的P12矩阵相乘 方阵 探索非方阵点乘 线代基础 能够点乘的矩阵 一定满足 前行 后列 算法思考 解决矩阵运算问题 切勿凭空想象 应脚踏实地 举个简单例子写在草稿纸上 并观察 各矩阵下标变化规律
  • git clone 失败或速度慢

    总之就是加代理yyds 具体做法 在github网址前面加上前缀 https ghproxy com 即可 git clone https ghproxy com https github com xxx git
  • Python—爬取小说案例(bs4方法)

    一 源码 import requests from bs4 import BeautifulSoup UA伪装 headers User Agent Mozilla 5 0 Windows NT 10 0 Win64 x64 AppleWe
  • mosquitto安装mysql插件 进行权限认证

    简介 因工作中需要对接物联网设备 设备数据的上传和下发都需要不同的连接账号作为topic 因此采用mqtt mysql的方式 动态的维护mqtt的账号 目录 简介 一 安装依赖 二 下载压缩包 三 安装mosquitto 四 安装mosqu