背景
隨著社會(huì)的發(fā)展,現(xiàn)在前端展示的方式多樣,由原本網(wǎng)頁(yè)單一形式,到現(xiàn)在的網(wǎng)頁(yè)、小程序、Android、IOS等多元化模式。由于前端展示的多元化,原有采用session有狀態(tài)的認(rèn)證方式已經(jīng)無(wú)法滿足需求,所以需要調(diào)整后臺(tái)的技術(shù)框架,讓系統(tǒng)能滿足有狀態(tài)認(rèn)證和無(wú)狀態(tài)token認(rèn)證并存。
方案
后臺(tái)的管理系統(tǒng)是采用碼云上開源的renren-security系統(tǒng),該系統(tǒng)采用的認(rèn)證框架是Shiro??紤]系統(tǒng)采用原本的權(quán)限控制采用Session方式,整體風(fēng)險(xiǎn)大且時(shí)間周期長(zhǎng),所以整合考慮采用SessionId作為token的方式,進(jìn)行無(wú)狀態(tài)的token認(rèn)證方式。
登錄時(shí),POST用戶名與密碼到/login進(jìn)行登入,如果成功返回一個(gè)會(huì)話ID,以會(huì)話ID作為token,失敗的話直接返回401錯(cuò)誤。之后用戶訪問每一個(gè)需要權(quán)限的網(wǎng)址請(qǐng)求必須在header中添加Authorization字段,例如Authorization: token,token為密鑰。后臺(tái)會(huì)進(jìn)行token的校驗(yàn),如果有誤會(huì)直接返回401。
Token驗(yàn)證
在login方法驗(yàn)證通過后,以SessionId作為token,通過json返回客戶端。
Token校驗(yàn)流程
重寫Sessionmanager的getSessionId方法,獲取token作為SessionId,同時(shí)修改request的“REFERENCED_SESSION_ID”為token,因?yàn)閠oken為驗(yàn)證通過的sessionId,所以此request也會(huì)采用驗(yàn)證通過的Session進(jìn)行獲取驗(yàn)證和權(quán)限。
流程
準(zhǔn)備Maven文件
新建一個(gè)Maven工程,添加相關(guān)的依賴。
實(shí)現(xiàn)Realm
編寫認(rèn)證方法和授權(quán)方法。
重寫SessionManager
重寫繼承DefaultWebSessionManager的SessionManager,修改getSessionId方法,通過獲取的token作為SessionId。
配置Shiro
配置Realm和SessionManager,還有關(guān)于路徑的攔截等配置。
整體配置可以參考:https://blog.csdn.net/qq_34996727/article/details/81133729
SessionManager可以參考:https://blog.csdn.net/u011456867/article/details/80484559