静态文件鉴权下载


前言

很多时候,我们需要提供文件下载或在线查看功能,而且要求有权限才能下载,那么一般通过文件流方式来做,相对来说实现起来也比较简单,后端读取文件返回文件流即可,然而这种方式最大的缺点是内存消耗大,如果下载的文件比较大或者下载请求多,很容易造成服务器内存溢出甚至服务宕机。本文将通过静态文件方式下载,以同时满足性能和安全性要求。



一、目的

  • 下载鉴权
  • 静态文件下载
  • 隐藏真实静态文件路径

二、实现方案

静态文件鉴权下载_第1张图片

服务支持:前端服务(部署nginx)、后端服务(提供鉴权接口,可以是微服务)。

描述:客户发起一个下载请求,前端服务nginx接收到请求后转发给后端鉴权接口处理,鉴权成功需在响应头返回三个参数Content-Disposition(用于指定下载文件名称,即客户端的文件名)、Content-Type(类型,一般为application/octet-stream)、X-Accel-Redirect(指定需下载的文件路径),nginx接收到响应后即可下载文件。


二、实现步骤


1.前端服务Nginx配置

请求转发:

location ^~ /api/ {
    proxy_redirect off;
    proxy_pass http://localhost:8080/api/;
}

内部下载:

location /file/ {
    internal;
    root /;
}


2.后端返回响应头信息

代码:

response.setHeader("Content-Disposition","attachment;filename=文件名.pdf");
response.setHeader("Content-Type","application/octet-stream");
response.setHeader("X-Accel-Redirect","/file/test.pdf");

 假设前置服务访问链接:http://localhost:8080,后端服务鉴权接口访问链接:http://localhost:8081/api/auth,则下载链接可以是:http://localhost:8080/api/auth?token=xxx,实际访问的静态文件链接:http://localhost:8080/file/test.pdf,因为使用了internal,该链接已被屏蔽,无法直接访问。



总结

本文通过nginx的internal及返回响应头参数的方式介绍静态文件下载鉴权实现方案,满足性能和安全性要求。如大家有更好的方案,欢迎讨论交流。

你可能感兴趣的:(经验分享,nginx)