Nginx静态资源增加权限验证
- 一、前言
- 二、解决思路
- 2.1、方式一
- 2.2、方式二
- 三、代码
- 3.1、方式一
- 3.1.1、前端代码
- 3.1.2、后端代码
- 3.1.3、Nginx调整
- 3.1.4、注意事项
- 3.2.方式二
- 四、参考资料
一、前言
在项目开发的过程中,项目初期,及大部分小型项目都是使用共享磁盘进行静态文件的存储。比如图片,视频等。
在调用接口存储至服务器后,返回文件路径,然后通过Nginx的代理,直接访问文件。
该方式如果在内部网络,问题并不会特别明显。如果暴露在互联网之后,就会有信息泄露的风险。
如果系统文件存储的方式存在一定的规律,如用时间拆分存储,那么便可以通过遍历文件的方式入侵系统获取文件,风险很大。
二、解决思路
2.1、方式一
对于二次开发的项目,涉及的面比较广,一个一个的修改会很耗时。通过简化处理减少改动量。
具体如下:
1、系统登录之后,需要存储token认证信息。
2、在需要访问文件的时候,带入token,在Nginx中鉴权,调用 权限认证接口。
3、认证成功则返回文件,反之则拒绝访问。
流程如下:
2.2、方式二
如果在项目搭建初期,可以采用独立鉴权的方式处理该问题。引入鉴权码的概念。通过鉴权码做一层防火墙。
具体如下:
1、系统登录之后,需要存储token认证信息。
2、在需要访问文件的时候,先调用系统 权限获取接口,传输 文件名称、token。
3、后端根据token、文件名称鉴权。
3.1、当前token是否生效。
3.2、当前token的用户是否拥有该文件的权限。
4、鉴权完成获取鉴权码。
5、使用鉴权码,调用Nginx获取附件,在Nginx中鉴权,调用 权限认证接口
6、认证成功则返回文件,反之则拒绝访问。
流程如下:
三、代码
3.1、方式一
3.1.1、前端代码
在登录成功之后需要往cookie中存放token。如果已经存在,则不需要处理。
cookies最大4K,token不能超过,不然会设置不上。
3.1.2、后端代码
@GetMapping("/isLgn")
@ResponseBody
public void isLgn(HttpServletResponse response) {try {String token = SessionUtil.getRequest().getHeader("token");if(StringUtils.isEmpty(token)){String cookie = SessionUtil.getRequest().getHeader("cookie");log.info("this cookie is:" + cookie);token = extractToken(cookie);}if(StringUtils.isEmpty(token)){response