基於Nginx Lua實現的Token鑑權認證

2021-10-09 16:40:11 字數 3506 閱讀 9681

管理員要發布乙個公告,在前台傳送post請求,攜帶需要發布的json資料,呼叫後台api服務,通過需要發布的資料,利用freemaker模板,生成乙個靜態頁,儲存到伺服器指定目錄。

所以,乙個靜態頁面,無論非登入使用者還是已登入但是沒有授予檢視該稿件許可權的使用者,頁面能夠做的是利用js判斷他們的使用者型別,是否具有檢視稿件角色許可權,如果沒有則隱藏靜態資料,提示相關資訊,拒絕他們檢視。

這對於非法使用者來說,相當危險,他們可以通過檢視網頁源**,找到當前隱藏的input標籤,從而獲取資料。

另外,通過爬蟲也可以直接爬取所有包含敏感資訊的頁面的資料。

所以,需要思考該怎麼樣,在頁面訪問之前,攔截到非法使用者,直接拒絕他們訪問,跳轉到相關頁面,不讓他們竊取資料。

利用nginx+lua,做乙個token鑑權模組,攔截訪問以.shtml結尾的頁面,根據使用者型別呼叫後台鑒權介面,的帶返回型別後,再跳轉到當前使用者可以檢視的頁面。

前提:使用者登入後,會在cookie裡儲存token

key為unit_token

value=token的值

(各位可根據實際情況修改lua獲取token值的方式)

(1)使用者在訪問頁面時,首先經過nginx,我們可以在nginx設定location匹配值,.shtml結尾的頁面走指定lua指令碼。

(2)在lua指令碼中,獲取到使用者訪問的位址,擷取.shtml結尾前的字串,有可能為空(首頁),index,list,或者具體某個稿件(uuid), 如 http://localhost:8080/jdgg/jdqx/1216721652781.shtml ,我們擷取到具體稿件id:1216721652781

並檢測請求頭中是否存有token(使用者登入後會將token儲存到cookie中,每次使用者訪問時請求頭會攜帶cookie中的token

整理請求格式

傳送到後台進行鑑權。

(4)如果後台鑒權介面呼叫成功,則根據返回的引數決定跳轉到哪個頁面。

好處:無需修改靜態頁面,無論什麼樣的使用者訪問,都可以根據使用者型別跳轉到指定頁面,防止非法使用者爬取資料,或者通過檢視網頁源**檢視敏感資料。

分為向所有人員公開的**,及內部人員才可以訪問的**。

安全模組需求:

(2)允許部分使用者訪問(在呼叫後台鑒權介面成功後):

返回false:跳轉到401(未授權頁面)

返回true: 表示允許使用者訪問

(3)呼叫後台鑒權介面失敗:

返回值狀態碼非200: 跳轉到503頁面(內部伺服器錯誤)

請求超時(可能伺服器掛了) 跳轉到503頁面

安全模組需求:

(1)當使用者訪問任意乙個頁面時,如果未登入,直接跳轉到登入頁

(2)如果使用者已登入,在訪問任意乙個頁面時,會將引數(稿件id + token)傳遞並呼叫後台鑒權介面判斷

如果返回3-> 未授權,則跳轉到401頁面

如果返回2-> 使用者未登入,跳轉到登入頁

如果返回1-> 允許使用者訪問

(3)呼叫後台鑒權介面失敗:

返回值狀態碼非200: 跳轉到503頁面(內部伺服器錯誤)

請求超時(可能伺服器掛了) 跳轉到503頁面

(value =

"/content"

,method = requestmethod.get)

@responsebody

@apioperation

("稿件檢視許可權校驗"

)public

boolean

contentjurisdiction

(@requestparam

("contentid"

)string contentid,

@requestparam

(name =

"token"

,defaultvalue =

"0")string token)

map json =

(map) json.

parse

(entity.

getdocextendjson()

);map content =

(map) json.

parse

(json.

get(

"json").

tostring()

);if(content.

containskey

("publictype"))

else

return

false;}

}}return

true;}

(value =

"/content"

,method = requestmethod.get)

@responsebody

@apioperation

("稿件檢視許可權校驗"

)public integer contentjurisdiction

(@requestparam

(name =

"contentid"

,defaultvalue =

"0")string contentid,

@requestparam

(name =

"token"

,defaultvalue =

"0")string token)

//校驗token sm特殊需求

string result = contentdatabaseservicei.

checktoken

(token)

;//如果沒有contentid並且token校驗通過 返回if(

"0".

equals

(contentid)

)return1;

} contentdatabaseentity entity = contentdatabaseservicei.

selectcontentbycontentid

(contentid);if

(null == entity)

map json =

(map) json.

parse

(entity.

getdocextendjson()

);map content =

(map) json.

parse

(json.

get(

"json").

tostring()

);if(content.

containskey

("publictype"))

return3;

}}return1;

}

基於nginx lua應用

一 場景概述 近期業務應用過程當中,需要對不同的型別進行分流 實現的總體方向是將原有的免費的內容進行付費改造。經過業務討論,實現方案有兩種。在以上兩種方案實施過程當中面臨乙個問題需要解決,付費內容實現後,部分原有的免費資源如何跳轉到付費的平台。同乙個資源不能既免費又付費,這存在問題。二 解決思路 1...

NGINX LUA實現複雜的控制

lua nginx module 可以一步步的安裝,也可以直接用 的openresty centos和debian的安裝就簡單了。這裡說下freebsd的安裝 fetch tar zxvf lua 5.1.4.tar.gz cd lua 5.1.4 make freebsd make install...

nginx lua實現登陸驗證

用於在多台伺服器上單點登入sso 無session,使用者身份的驗證。1 安裝lua yum install readline.x86 64 readline devel.x86 64 wget make linux make install 注意 不要使用5.2版本,5.2版本的lua和nginx...