ShiroJwt
v2.0
前端網址:https://github.com/wang926454/VueStudy/tree/master/VueStudy08-JWT
有疑問請掃碼加QQ群交流: 779168604
- 首先Post用戶名與密碼到user/login登錄,成功回傳加密的AccessToken ,失敗直接回傳401錯誤(帳號或密碼不正確)
- 以後訪問都帶上這個AccessToken即可
- 鑑權流程主要是重寫了Shiro的入口過濾器JWTFilter ( BasicHttpAuthenticationFilter ),判斷請求Header裡面是否包含Authorization字段
- 有就進行Shiro的Token登入認證授權(用戶存取每一個需要權限的請求必須在Header中添加Authorization字段存放AccessToken ),沒有就以遊客直接訪問(有權限管控的話,以遊客訪問就會被攔截)
大部分是以MD5 + 鹽的形式解決了這個問題(詳細自己百度),我採用AES-128 + Base64是以帳號+密碼的形式進行加密密碼,因為帳號具有唯一性,所以也不會出現相同結構的暗文密碼這個問題
本來是直接將JedisUtil注入為Bean ,每次使用直接
@Autowired
注入使用即可,但是在重寫Shiro的CustomCache無法注入JedisUtil ,所以就改成靜態注入JedisPool連接池, JedisUtil工具類別還是直接調用靜態方法,無需@Autowired
注入
- 登入認證通過後返回AccessToken資訊(在AccessToken中儲存目前的時間戳記和帳號)
- 同時在Redis中設定一條以帳號為Key,Value為目前時間戳(登入時間)的RefreshToken
- 現在認證時必須AccessToken沒失效以及Redis存在所對應的RefreshToken ,且RefreshToken時間戳和AccessToken資訊中時間戳一致才算認證通過,這樣可以做到JWT的可控性
- 如果重新登入取得了新的AccessToken ,舊的AccessToken就認證不了,因為Redis中所存放的的RefreshToken時間戳資訊只會和最新產生的AccessToken資訊中攜帶的時間戳一致,這樣每個使用者就只能使用最新的AccessToken認證
- Redis的RefreshToken也可以用來判斷用戶是否在線,如果刪除Redis的某個RefreshToken ,那麼這個RefreshToken所對應的AccessToken之後也無法通過認證了,就相當於控制了用戶的登錄,可以剔除用戶
- 本身AccessToken的過期時間為5分鐘(設定檔可設定), RefreshToken過期時間為30分鐘(設定檔可設定)
- 當登入後時間過了5分鐘之後,目前AccessToken便會過期失效,再次帶上AccessToken訪問JWT會拋出TokenExpiredException異常說明Token過期
- 開始判斷是否要進行AccessToken刷新, Redis查詢目前使用者的RefreshToken是否存在,以及這個RefreshToken所攜帶時間戳記和過期AccessToken所攜帶的時間戳是否一致
- 如果存在且一致就進行AccessToken刷新,設定過期時間為5分鐘(設定檔可設定),時間戳為目前最新時間戳,同時也設定RefreshToken中的時間戳為目前最新時間戳,刷新過期時間重新為30分鐘過期(設定檔可設定)
- 最後將刷新的AccessToken存放在Response的Header中的Authorization字段返回(前端進行獲取替換,下次用新的AccessToken進行訪問)
先設定srcmainresourcesgeneratorgeneratorConfig.xml檔案(預設設定都在原來套件的下一層reverse套件下),在pom.xml這一級目錄(即專案根目錄下)的命令列視窗執行(前提是配置了mvn)(IDEA可以直接在Maven視窗Plugins中雙擊執行)
mvn mybatis-generator:generate
先设置Content - Type为application / json
然后填写请求参数帐号密码信息
进行请求访问,请求访问成功
点击查看Header信息的Authorization属性即是Token字段
访问需要权限的请求将Token字段放在Header信息的Authorization属性访问即可
Token的自动刷新也是在Token失效时返回新的Token在Header信息的Authorization属性