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