Ctrl c+v大王 2025-11-17 16:45 采纳率: 0%
浏览 11

使用Dockerfile构建vernemq结合自定义lua脚本实现自定义认证逻辑

Dockerfile文件构建vernemq镜像,自定义init.lua脚本

-- init.lua  注册版
print('[AUTH] init.lua loaded')

-- 1. 定义钩子
local function auth_on_register(reg)
    print('[AUTH] auth_on_register called')
    print('[AUTH] username=' .. (reg.username or 'nil'))
    print('[AUTH] client_id=' .. (reg.client_id or 'nil'))
    return true   -- 先无脑放过,调通后再加 SQL
end

local function auth_on_publish(pub)
    return true
end

local function auth_on_subscribe(sub)
    return true
end

-- 2. 必须把表赋给 **全局变量 hooks**
hooks = {
    auth_on_register = auth_on_register,
    auth_on_publish  = auth_on_publish,
    auth_on_subscribe= auth_on_subscribe
}

然后我使用Docker创建容器,使用mqttx连接,一直连接不上,mqttx报错Error: Connection refused: Bad User Name or Password,容器日志输出

2025-11-17T08:17:52.423367+00:00 [warning] <0.561.0> vmq_mqtt5_fsm:check_user/3:1119: can't authenticate client {[],<<"MQTTX-Monitor">>} from 172.17.0.1:53456 due to plugin_chain_exhausted
2025-11-17T08:17:52.423832+00:00 [debug] <0.561.0> vmq_ranch:teardown/2:190: session normally stopped
2025-11-17T08:17:52.662802+00:00 [debug] <0.270.0> vmq_swc_store:handle_info/2:799: Replica meta6: Can't initialize AE exchange due to no peer available

真的没办法了,脚本也加载了,一直找不到问题在哪,创建容器的命令

docker run -it --rm --name vernemq -p 10.0.2.72:1883:1883 -p 10.0.2.72:8883:8883 -p 10.0.2.72:8080:8080 -p 10.0.2.72:8081:8081 -p 10.0.2.72:44053:44053 -v D:\VerneMQ\vernemq.conf:/vernemq/etc/vernemq.conf -v D:\VerneMQ\vmq_diversity.conf:/vernemq/etc/vmq_diversity.conf -v D:\VerneMQ\init.lua:/vernemq/share/lua/auth/auth.lua -v D:\VerneMQ\vm.args:/vernemq/etc/vm.args vernemq-mysql:1.1 /vernemq/bin/vernemq console

两种挂载init.lua的方式都试过了,都不行

docker run -it --rm --name vernemq -p 10.0.2.72:1883:1883 -p 10.0.2.72:8883:8883 -p 10.0.2.72:8080:8080 -p 10.0.2.72:8081:8081 -p 10.0.2.72:44053:44053 -v D:\VerneMQ\vernemq.conf:/vernemq/etc/vernemq.conf -v D:\VerneMQ\vmq_diversity.conf:/vernemq/etc/vmq_diversity.conf -v D:\VerneMQ\init.lua:/vernemq/share/lua/init.lua -v D:\VerneMQ\vm.args:/vernemq/etc/vm.args vernemq-mysql:1.1 /vernemq/bin/vernemq console

vernemq.conf配置文件:

## ========= 基础 =========
allow_anonymous = off
allow_register_during_netsplit = on
allow_publish_during_netsplit = on
allow_subscribe_during_netsplit = on
allow_unsubscribe_during_netsplit = on

## ========= 监听 =========
listener.tcp.default = 0.0.0.0:1883
listener.ws.default  = 0.0.0.0:8080

## ========= 日志 =========
log.console = console
log.console.level = debug

## ========= 插件 =========
plugins.vmq_diversity = on
vmq_diversity.script_dir = /vernemq/share/lua

Dockerfile文件内容:

# Stage 1: The builder stage. This container is used to build the VerneMQ application.
FROM ubuntu:24.04 AS builder

# 使用国内镜像源替换默认源
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

# 为 apt 设置不使用代理
RUN echo 'Acquire::http::Proxy "false";' > /etc/apt/apt.conf.d/99proxy && \
    echo 'Acquire::https::Proxy "false";' >> /etc/apt/apt.conf.d/99proxy

# Install necessary build dependencies (不使用代理)
RUN apt-get update && apt-get install -y \
    git \
    build-essential \
    cmake \
    rebar3 \
    erlang-dev \
    erlang-parsetools \
    erlang-tools \
    libssl-dev \
    libsnappy-dev \
    procps \
    libncurses5-dev \
    && rm -rf /var/lib/apt/lists/*

# 设置代理用于 GitHub 下载
ENV http_proxy=http://x.x.x.x
ENV https_proxy=http://x.x.x.x
ENV HTTP_PROXY=http://x.x.x.x
ENV HTTPS_PROXY=http://x.x.x.x

# Clone the VerneMQ repository, specifically the 2.1.1 tag.
RUN git clone -b 2.1.1 --depth 1 https://github.com/vernemq/vernemq.git /vernemq

# Set the working directory to the cloned repository.
WORKDIR /vernemq

# Build the VerneMQ release.
RUN make rel

# Stage 2: The final runtime image.
FROM ubuntu:24.04

# 使用国内镜像源替换默认源
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

# 为 apt 设置不使用代理
RUN echo 'Acquire::http::Proxy "false";' > /etc/apt/apt.conf.d/99proxy && \
    echo 'Acquire::https::Proxy "false";' >> /etc/apt/apt.conf.d/99proxy

# 安装 Erlang 运行时和必要的依赖 (不使用代理)
RUN apt-get update && apt-get install -y \
    erlang \
    libssl-dev \
    libsnappy1v5 \
    default-mysql-client \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# Create necessary directories
RUN mkdir -p /vernemq/etc /vernemq/share/lua

# Copy the compiled release from the builder stage.
COPY --from=builder /vernemq/_build/default/rel/vernemq /vernemq

# Copy configuration files
COPY vernemq.conf /vernemq/etc/vernemq.conf
COPY vmq_diversity.conf /vernemq/etc/vmq_diversity.conf
COPY mysql_auth.lua /vernemq/share/lua/mysql_auth.lua

RUN rm -f /vernemq/share/lua/auth/*mysql*.lua

# Set the working directory for the final image.
WORKDIR /vernemq

# 清除代理设置(运行时不需要)
ENV http_proxy=
ENV https_proxy=
ENV HTTP_PROXY=
ENV HTTPS_PROXY=

# Expose the standard VerneMQ ports.
EXPOSE 1883 8883 8080 8081 44053

# The default command to run when the container starts.
CMD ["/vernemq/bin/vernemq", "console"]

  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-11-17 16:47
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 要使用Dockerfile构建vernemq镜像并集成自定义的lua脚本实现认证逻辑。重点在于如何在Dockerfile中正确配置vernemq,使其能加载并运行自定义的init.lua脚本。
    2. 解决方案:
      - 编写Dockerfile
      ```Dockerfile
      FROM vernemq/vernemq:1.10.1

      COPY init.lua /vernemq/etc/vernemq/scripts/

      # 假设vernemq启动脚本会自动加载scripts目录下的lua脚本
      CMD [“vernemq”, “start”]
      - **init.lua脚本示例(补充完整)**:lua
      print(‘[AUTH] init.lua loaded’)

      – 1. 定义钩子
      local function custom_auth_hook(auth_type, username, password, clientinfo)
      – 这里实现自定义认证逻辑,例如查询数据库验证用户名密码
      – 简单示例:直接验证用户名是否为admin
      if username == “admin” then
      return true
      else
      return false
      end
      end

      – 注册认证钩子
      local hooks = require(‘vernemq.hooks’)
      hooks:register(‘client.authenticate’, custom_auth_hook)
      ```
      3. 方案优缺点:
      - 优点
      - 这种方式简单直接,通过Dockerfile的COPY指令将自定义脚本复制到vernemq的脚本目录,利用vernemq默认的脚本加载机制来运行自定义脚本,易于理解和实现。
      - 缺点
      - 依赖于vernemq默认的脚本加载方式和目录结构,如果vernemq版本更新,脚本加载机制或目录结构改变,可能需要调整Dockerfile。
      4. 总结:
      通过上述的Dockerfile配置,可以方便地将自定义的init.lua脚本集成到vernemq镜像中,实现自定义认证逻辑。在实际应用中,可根据具体需求完善lua脚本中的认证逻辑,如与数据库交互等。同时,要注意vernemq版本变化对脚本加载的影响,及时调整配置。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 修改了问题 11月18日
  • 创建了问题 11月17日