如何从Lua获取OIDC用户信息并写入Nginx访问日志?
实现Lua认证用户的Nginx访问日志记录
核心思路
Nginx原生的$remote_user仅对应内置认证机制(如Basic Auth),Lua自定义认证的用户信息需要通过自定义Nginx变量传递到日志模块,再替换日志格式中的$remote_user。
步骤1:在Lua中传递用户信息到Nginx变量
Lua本身没有“原生获取已认证用户”的方法——因为认证逻辑是你自己实现的(比如解析JWT、数据库校验等),所以需要在认证通过后,主动将用户信息写入自定义的Nginx变量:
- 先在Nginx配置的
http块中声明自定义变量(初始化为空):
http { set $lua_remote_user ""; # 其他全局配置... }
- 在你的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
相关产品推荐
相关产品推荐

