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