一、问题背景
与第三方平台合作售卖产品,交易过程中产出交易证明的pdf文件(含客户敏感信息),第三方需要实现对客户开放的文件预览及下载。 文件所在服务器在公司内网区无法对外,一般通过外网区转发实现对外。
二、解决方案
- 我方将文件放置本地服务器,第三方定时通过sftp来下载该文件,并完成后续给客户的预览下载功能。
- 我方提供文件的静态访问url,第三方直接挂载在前端页面给客户预览及展示。
方案一第三方觉得麻烦不接受,方案二存在安全问题我方拒绝全外网开放(固定规范的url直接暴露在互联网,存在被暴力枚举从而下载到文件),最终折中方案是我方提供静态访问url,但只放开端对端的网络权限给第三方,由第三方通过url下载在本地自行实现前端预览展示。
三、处理过程
- 内网后端服务器继承实现WebMvcConfigurer,将本地文件转成可访问资源url上。
@Component
public class PhotoUtils implements WebMvcConfigurer {
@Value
private String imgPath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/image/**").addResourceLocations("file:" + imgPath);
}
}
- 外网服务器Nginx配置转发
- 配置Nginx IP转发:监听对该服务器8080端口的访问,并且限定仅当访问源是10.120.11.1时将请求转发至10.110.11.1:8081
#按ip端口做代理转发
stream{
#添加转发的代理
upstream transmit{
hash $remote_addr consistent;
# 转发的目的地址和端口
server 10.110.11.1:8081;
}
#提供转发服务
server{
listen 8080;
#允许访问IP
allow 10.120.11.1;
#限制访问IP
deny all;
#转发至代理服务器
proxy_pass transmit;
}
}
- 配置Nginx 访问路径转发:监听对该服务器8080端口的访问,并且访问路径匹配/server/image/* 时将请求转发至10.110.11.1:8081
#按请求路径做代理转发
http {
#添加转发的代理
upstream image-server{
hash $remote_addr consistent;
# 转发的目的地址和端口,也可以是域名
server 10.110.11.1:8081;
}
#提供转发服务
server{
listen 8080;
location ^~ /server/image/ {
proxy_pass http://image-server$request_uri;
}
}
}
- 因为信创替换,需要在东方通中配置静态文件访问转发:监听对该服务器8080端口的访问,访问路径正则匹配/server/image/* 时将请求转发至10.110.11.1:8081
#在虚拟主机中正则匹配静态文件路径做转发
<VirtualHost 10.110.11.2:8080>
ProxyPassMatch ^(/server/image/.*\.pdf)$ http://10.153.201.119:22010
</VirtualHost>