介绍

将请求header中不存在 Authorization字段,且 Cookie 中不存在 auth 关键字的请求链接定义为未授权页面,使用 OpenResty + Lua 脚本,对未授权页面进行检测、拦截



1. 创建lua脚本文件 auth.lua

$ mkdir /opt/openresty/nginx/conf/lua && cd /opt/openresty/nginx/conf/lua
$ vim auth.lua
-- 程序配置 --
-- 是否启动拦截
local unauthorized_access = false

----

-- 获取请求的URI
local uri = ngx.var.uri
local authorization_header = ngx.var.http_Authorization
local cookies = ngx.req.get_headers()["Cookie"]


-- 忽略静态资源文件或
if string.match(uri, "%.css$") or string.match(uri, "%.js$") or string.match(uri, "%.jpg$") or string.match(uri, "%.mp4$") or string.match(uri, "%.html$") or string.match(uri, "%.php$") then
    return
end


-- 判断是否存在 Authorization 字段
if authorization_header and string.match(authorization_header, "Authorization") then
    return
-- 判断 Cookie 中是否包含 auth
elseif cookies and string.match(cookies, "auth") then
    return
else
    -- 未授权页面写入错误日志
    ngx.log(ngx.ERR, "URI: ", uri)
    -- 未授权页面返回417状态码
    if unauthorized_access then
        ngx.log(ngx.ERR, "URI: ", uri)
        ngx.status = 417
        ngx.say("Unauthorized access")
        ngx.exit(417)
    end
end

2. 在openresty配置文件中引入 lua 脚本

$ cd /opt/openresty/nginx/conf
$ vim nginx.conf
  location / {
    access_by_lua_file conf/lua/auth.lua;
  
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Nginx-Proxy true;
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://upsteam_server_ip;
  }

3. 重新加载 openresty

$ cd /opt/openresty/bin
$ ./openresty -s reload

文章作者: hzbb
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 运维小记
开发 Lua Jit Lua
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝