采用openresty作为网关为静态资源鉴权访问

项目中老系统文件服务数据需迁移到新的fastdfs文件服务,但上传后文件名改变且数据量大。决定用nginx作文件服务,为识别用户权限需鉴权。因项目组情况选择openresty,原方案因客户网络要求调整为openresty请求Java接口获取权限结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在项目中遇到了一个需求。新系统采用的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确实很强大、后续继续学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BUG胡汉三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值