Nginx:通过将标头值与文件内容进行比较来授予访问权限;可能?

时间:2014-10-10 19:34:02

标签: authentication nginx lua

我希望通过将自定义标头值与例如文件中的条目进行比较来限制对某些静态文件的访问。基本上我想在另一个(受限制的)应用程序中生成这样的令牌,并让Nginx拒绝所有具有不匹配标头和标头值(令牌)的请求。

到目前为止我所阅读的内容是HttpLuaModule可以扩展Nginx编写Lua代码。但我不知道我的想法是否有任何机会可行。

那么,是否有使用标准nginx模块的简单解决方案(首选)?或者是通过重新安装/编译包含前面提到的模块的nginx安装Lua模块我唯一的机会?

1 个答案:

答案 0 :(得分:6)

您可以通过lua轻松完成此操作。检查aaki提到的lua-nginx-module的文档。所需要的一切 - 只需在获取请求阶段插入逻辑,例如:

location / {
    lua_need_request_body on;

    client_max_body_size 100k;
    client_body_buffer_size 100k;

    access_by_lua '
        -- check the client IP address is in our black list
        if ngx.var.remote_addr == "132.5.72.3" then
            ngx.exit(ngx.HTTP_FORBIDDEN)
        end

        -- check if the request body contains bad words
        if ngx.var.request_body and
                 string.match(ngx.var.request_body, "fsck")
        then
            return ngx.redirect("/terms_of_use.html")
        end

        local f = io.open("/tmp/foo")
        local token = f:read("a")
        local user_token = ngx.req.get_headers()["user-session-token"]

        if not user_token or user_token ~= token then
            ngx.exit(ngx.HTTP_FORBIDDEN)
        end

        -- tests passed
    ';

    # proxy_pass/fastcgi_pass/etc settings/proceed the request and so on
 }