前言
1
同nginx配置server以后,我们可以很方便的直接访问到文件服务器上的文件资源,但是某些情况下,文件资源可能是隐私图片,比如客户注册时上传的身份证照片等等,这时候我们需要对图片访问进行控制,必须登录后才能查看到这些隐私图片。
2
一般来说,我们都是通过后端controller对权限进行控制,但是nginx作为图片服务器的情况下,再专门为此写一个后端程序显然比较笨重。所以根据实际情况,我们采用openresty平台,用lua脚本+redis读取token的方式即可完成对图片访问服务器的权限控制。
步骤
1.服务器文件目录设置
正常来说我们的文件存放目录是统一的,但是由于有些文件是开放访问的,比如网页图片,有的文件是隐私的,比如注册信息。所以此时我们将文件服务器目录修改为两个文件夹,public和private,public用以存放开发文件,private存放登陆后才可以访问的文件。
2.openresty下载
进入官网下载页:http://openresty.org/en/download.html
选择windows版本的压缩包进行下载
将压缩包解压到本地目录,openresty是nginx和lua的结合,此时我们编写lua脚本并修改nginx.conf,测试openresty。
在openresty目录下的lua文件夹下新建txt文件,
ngx.say('hello lua!!!')
然后重命名txt为hello.lua
如图所示
然后在penresty目录下的conf文件夹下,修改nginx.conf
server {
listen 9000;
server_name localhost;
location / {
default_type 'text/html';
rewrite_by_lua_file lua/hello.lua;
}
}
修改完成后,启动openresty下的nginx.exe
然后通过cmd运行
./nginx -s reload
启动nginx
然后浏览器键入 http://127.0.0.1:9000/ 如图所示即为成功
3 配置nignx权限控制
#反向代理进入文件查询服务器
upstream download{
server 127.0.0.1:8282;
}
server {
listen 8282;
server_name localhost;
location /file_resources/private/ {
alias D:/society/file_resources/private/;
}
}
server {
listen 8082;
server_name localhost;
client_max_body_size 10000m;
location / {
index index.html;
}
#开放文件,直接进入文件目录查找
location /file_resources/public/ {
alias D:/society/file_resources/public/;
}
#隐私文件,匹配下载请求前缀,进入token.lua, 进行token鉴权,
location /file_resources/private/ {
default_type 'text/html';
rewrite_by_lua_file lua/token.lua;
proxy_pass http://download;
}
}
4. token.lua编写
该处获取请求的token为get请求参数获取
如为cookie中, ngx.var.arg_token改为 ngx.var.cookie_token即可
-- 从cookie中获取token值key为token)
local token = ngx.var.arg_token
--判断token是否为空,为空返回登录
if not token then
ngx.redirect("http://127.0.0.1:8086/login", 302)
--判断token存在,则根据redis存储格式拼写Token, “..”为字符串拼接
else
token = "prefix_user_token_" .. ngx.var.arg_token
end
local function close_redis(red)
if not red then
return
end
local pool_max_idle_time = 30000 --毫秒
local pool_size = 50 --连接池大小
local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
if not ok then
ngx.say("close redis error : ",err);
end
end
-- 连接redis
local redis = require "resty.redis";
local red = redis:new();
red:set_timeout(2000)
local ok,err = red:connect("192.168.0.28", 6379)
if not ok then
ngx.say("failed to connect: ", err)
end
-- 根据自身redis是否有密码开启本部分
--local res, err = red:auth("password")
--if not res then
-- ngx.say("failed to authenticate: ", err)
--end
-- redis中若 key 存在返回 1 ,否则返回 0 。
local resp, err = red:exists(token)
if not resp then
ngx.say("get msg error : ", err)
return close_redis(red)
end
if resp == ngx.null then
resp = ''
end
if resp == 0 then
-- ngx.exit(ngx.HTTP_FORBIDDEN)
ngx.redirect("http://127.0.0.1:8086/login", 302)
end
close_redis(red)
完成后 执行 nginx -s reload重启nginx即可
5.结果展示
开开放图片
隐私图片访问失败
如图通过开发工具可以看到访问的是图片地址,由于token为空,所以直接转转到了login页面
文章来源:https://www.toymoban.com/news/detail-488775.html
隐私图片访问成功
带上token,访问成功
文章来源地址https://www.toymoban.com/news/detail-488775.html
到了这里,关于Windows 环境下nginx 静态资源服务器(图片,文件)权限控制(nginx/openresty/lua)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!