当前位置:网站首页>采用openresty作为网关为静态资源鉴权访问
采用openresty作为网关为静态资源鉴权访问
2022-07-22 10:52:00 【BUG胡汉三】
最近在项目中遇到了一个需求。新系统采用的fastdfs来做的文件服务。老系统是自己写的文件服务、里面存在大量的附件(上百G)、虽然是历史数据了但还是有访问的需求。老系统的数据也需要放到文件服务上面去、但是fastdfs不支持将文件直接复制到相应的目录、需要走fastdfs上传一次。然而上传到fastdfs过后附件的名称就会发生改变,这个时候就跟原数据库中的附件名称不匹配了。当然也可以在上传的时候记录下对应的文件名称的变化后的文件名称、但是考虑到数据量过于庞大、又要求快速上线。就想到直接使用nginx来配置一下,作为文件服务,反正这些资源也是静态的。
如果将文件通过nginx直接访问也有一个问题,没有办法识别用户是否登录,是否有权限查看该附件。所以需要使用对访问的用户做一次鉴权。了解到nginx有支持用户使用C来编写自己的插件。但是会写C的人项目组没有...现招人也来不及。如果直接使用java来做又觉得java处理起来速度会慢。这个时候找到了openresty。
关于openresty的具体介绍就不多说了。我们的方案本来是使用openresty访问redis然后,通过用户的token去匹配有权限就放行,没有就拦截的。但是因为客户对网络层级的要求、我们放在该区域的openresty不能直接去连接redis(要求不能连接、也不可以使用网络转发的形式去直连)。所以最后的方案就是openresty请求java接口,Java接口返回用户是否拥有权限,openresty返回结果。
openresty(nginx配置)
server {
listen 6699;
location ^~ / {
# lua脚本
content_by_lua_block {
local cookie = ngx.location.capture("/checkCookie");
--判断http请求是否成功
if cookie.status ~= 200 then
return ngx.exit(cookie.status)
end
local json = require("cjson");
local result = json.decode(cookie.body);
--判断心跳检查是否正常
if result.status ~= "200" then
return ngx.exit(403)
end
local uri = ngx.var.request_uri;
local res = ngx.location.capture("/images/"..uri);
ngx.say(res.body)
}
}
location = /checkCookie {
internal;
# 校验cookie是否合法(cookie自动带入)
proxy_pass http://127.0.0.1:8808/test/cookie;
}
location ^~ /images {
internal;
# 访问静态资源
alias D:/tool/web/img/;
}
}
Java接口(模拟)
@GetMapping("test/cookie")
public Object cookie(HttpServletRequest request){
String token = request.getHeader("Cookie");
log.debug(token);
Map<String,Object> result = new HashMap<>();
result.put("status","200");
result.put("success",true);
return result;
}
Java接口部分没有将具体的校验逻辑写出来、在这里可以对访问者进行登录认证、以及权限校验。openresty确实很强大、后续继续学习。
边栏推荐
猜你喜欢
Redis series 13 -- redis Sentinel
多线程05--ReentrantLock 原理
Jmeter性能测试
Multithreading 04 -- visibility of threads
pytest测试框架快速搭建
Using various weighting methods to place binary weighted capacitor array in SAR ADC
selenium测试框架快速搭建(ui自动化测试)
Vimplus modifies the terminal font to droid Sans Mono nerd font
解决微信小程序 thirdScriptError错误
Wechat applet cannot read property'setdata'of null error
随机推荐
树结构
Multithreading 04 -- order of threads
【FPGA】:ip核--ibert
pycharm设置
测试用例设计
微信小程序入门教程学习笔记——UI篇之操作反馈
网络基础知识
Redis series 12 -- redis master-slave
【FPGA】:ip核--DDR3
环境变量配置文件
pytest测试框架快速搭建
L'applet Wechat ne peut pas lire la propriété 'setdata' de NULL Error
Data transfer from one Mysql to another MySQL
Data skew
动态规划入门
【FPGA】:MicroBlaze的使用
顺序表的创建插入和修改
Charles 抓包原理与实践
spark常见问题
【ISE】开发流程加bit,mcs文件的烧写