You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Lua获取OIDC用户信息并写入Nginx访问日志?

实现Lua认证用户的Nginx访问日志记录

核心思路

Nginx原生的$remote_user仅对应内置认证机制(如Basic Auth),Lua自定义认证的用户信息需要通过自定义Nginx变量传递到日志模块,再替换日志格式中的$remote_user。


步骤1:在Lua中传递用户信息到Nginx变量

Lua本身没有“原生获取已认证用户”的方法——因为认证逻辑是你自己实现的(比如解析JWT、数据库校验等),所以需要在认证通过后,主动将用户信息写入自定义的Nginx变量:

  1. 先在Nginx配置的http块中声明自定义变量(初始化为空):
http {
    set $lua_remote_user "";
    # 其他全局配置...
}
  1. 在你的Lua认证逻辑中(比如access_by_lua_block或外部Lua脚本),将获取到的用户名赋值给这个变量:
location / {
    access_by_lua_block {
        # 替换成你的实际认证逻辑:比如从请求头、token、数据库获取用户名
        local user = ngx.req.get_headers()["X-Auth-User"] -- 示例:从请求头取用户
        -- 或者JWT解析场景:local jwt_payload = require("resty.jwt"):verify(secret, token); local user = jwt_payload.sub

        -- 将用户信息写入自定义变量,认证失败则留空
        ngx.var.lua_remote_user = user or ""
    }
    # 其他location配置...
}

步骤2:修改日志格式,替换$remote_user

在Nginx配置中,修改log_format,把原来的$remote_user替换为自定义的$lua_remote_user:

server {
    # 定义日志格式
    log_format custom_log '$remote_addr - $lua_remote_user [$time_local] "$request" '
                         '$status $body_bytes_sent "$http_referer" '
                         '"$http_user_agent"';

    # 指定使用自定义日志格式
    access_log /var/log/nginx/access.log custom_log;
    # 其他server配置...
}

如果需要兼容原生$remote_user(比如同时存在Basic Auth和Lua认证),可以这样组合:

log_format custom_log '$remote_addr - ${lua_remote_user:-$remote_user} [$time_local] "$request" '
                     '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent"';

这里${lua_remote_user:-$remote_user}表示:如果$lua_remote_user不为空则用它,否则用原生的$remote_user。


关键说明

  • ngx.var是Lua与Nginx核心变量交互的标准接口,通过它可以读写Nginx的全局/局部变量。
  • 自定义变量必须先在Nginx配置中声明(set $xxx ""),否则Lua无法赋值。

内容的提问来源于stack exchange,提问作者Mavis Dracula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 12:45:43