【全栈必备】Nginx 代理文件目录,访问文件做权限校验

前沿

做后台项目的时候,通常会有文件上传,上传的文件我们放到服务器上的目录,这时候预览下载走我们希望不走自己的服务,用nginx去代理,为了安全,这时候我们就要去做权限的验证了。在这里,我们提供两种方式去做校验,一种是在固定用户名,密码,还有一种方式通过访问API的方式。

固定用户密码验证

  1. 我们先把nginx代理文件目录做下配置
bash 复制代码
server {
    listen 80;
    server_name xxxx.com;

    location /upload-resource {
           # 设置文件目录路径
           alias /root/upload-resource;

           # 是否显示文件目录
           #autoindex on;
       
           # 其他相关配置
           # ...
   
        
    }
}

配置完之后,通过访问http://xxx.com/upload-resource/xxx.jpg,就能查看文件了。这是我们不想谁都能访问,通过输入用户名密码来访问,我们可以这样配置。

  1. 配置密码方式校验 在location中添加如下配置
bash 复制代码
    # 执行权限校验
    auth_basic "Restricted";
    auth_basic_user_file /path/to/htpasswd;

这两个配置的意思是

使用了 auth_basic 指令来进行基本的身份验证,并通过 auth_basic_user_file 指定了存储用户名和密码的文件路径。

你需要将 /path/to/htpasswd 替换为实际的文件目录路径,并提供一个包含正确用户名和密码的密码文件。

你可以使用 htpasswd 工具来生成密码文件,例如:

bash 复制代码
htpasswd -c /path/to/htpasswd username

如果没有 htpasswd这个命令, 可以使用 yum -y install httpd-tools 安装。

生成后的文件内容为

  1. 配置完成后,重启nginx。访问目标文件,会出现用户名密码弹框,

到这里,使用用户名密码的方式就配置完成了。访问文件之前需要输入用户名。

自定义校验

上面只能适用于一些简单的场景。我们在实际项目中,需要通过token去获取用户身份,然后接着判断是否能查看该文件。自定义校验我们需要加个token参数,访问地址为http://xxx.com/upload-resource/xxx.jpg?token=xxx。在这里我们看token作为url中的query参数传递,因为在html中img标签是没办法通过header携带参数。所以我们把token放到的query中。

  1. 在这里我们先提供一个验证api接口,去做鉴权。 api内容为
md 复制代码
// api 地址
http://xxxx.com/api/auth/file

// header参数
{
    Authorization: token
}

该api通过header中的token去获取用户信息,接着去验证权限信息。

  1. nginx配置
bash 复制代码
server {
    listen 80;
    server_name xxxx.com;

    location /upload-resource {
       set $auth_token $arg_token;
       # 发送验证请求到指定 URL
       auth_request /api/auth;
       # 设置文件目录路径
       alias /root/upload-resource;
    }

    location = /api/auth {
    
        # 发送验证请求到自定义验证服务的地址,并将 token 参数通过请求头传递
        proxy_pass http://127.0.0.1:8080/api/auth;
        # 其它配置
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Authorization $auth_token;
    }
}

这个配置中关键点信息

  • auth_request
bash 复制代码
 # 发送验证请求到指定 URL
 auth_request /api/auth;

通过使用 auth_request 指令,Nginx 将发送一个验证请求到 /api/auth 路径,以决定是否允许访问。

  • 提取url参数
bash 复制代码
set $auth_token $arg_token;

在上述配置中,$arg_token表示url中的token参数,然后设置到$auth_token变量中。后续就可以从$auth_token获取token变量。

  • 设置header参数
bash 复制代码
 proxy_set_header Authorization $auth_token;

$auth_token 的值设置为请求头中的 Authorization 字段的值。通过这样的配置,当 Nginx 发送验证请求到自定义验证服务时,会将 $auth_token 的值作为请求头中的 Authorization 字段传递给验证服务。

结束语

通过以上两种方式,我们可以实现nginx代理文件的权限验证。小伙伴可以根据需求自己随意选择。

如果你觉得该文章不错,不妨

1、点赞,让更多的人也能看到这篇内容

2、关注我,让我们成为长期关系

3、关注公众号「前端有话说」,里面已有多篇原创文章,和开发工具,欢迎各位的关注,第一时间阅读我的文章

相关推荐
xiao-xiang9 分钟前
jenkins-通过api获取所有job及最新build信息
前端·servlet·jenkins
C语言魔术师25 分钟前
【小游戏篇】三子棋游戏
前端·算法·游戏
匹马夕阳2 小时前
Vue 3中导航守卫(Navigation Guard)结合Axios实现token认证机制
前端·javascript·vue.js
你熬夜了吗?2 小时前
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
前端·vue.js·信息可视化
桂月二二8 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
hunter2062069 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb9 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角9 小时前
CSS 颜色
前端·css
九酒10 小时前
从UI稿到代码优化,看Trae AI 编辑器如何帮助开发者提效
前端·trae
浪浪山小白兔10 小时前
HTML5 新表单属性详解
前端·html·html5