
Sa-Token
經過前兩篇文章的體驗,我已經初步接觸了Sa-Token的登入、退出、線上狀态檢測以及前後端分離的實作。這次來體驗Sa-Token部分常用配置。
sa-toekn.token-name token名稱
首先是前文用到過的token-name,token-name用來指定token的名稱,如果不指定,預設的名稱是satoken,我們删掉所有配置來測試一下。
隻留端口配置
這時執行登陸,檢視傳回内容
預設tokenName
可以看到預設的token名稱是satoken,我們可以通過修改token-name配置,指定我們需要的token名稱
sa-token:
token-name: token
再次登入
被修改的token名稱
sa-toekn.timeout 逾時時間
逾時時間,預設是三十天,機關是秒,我們來配置個5秒逾時,驗證一下是否好用
sa-token:
token-name: token
timeout: 5
執行登入,然後檢視登陸狀态
登入成功
5秒後再次查詢登陸狀态
已逾時掉線
sa-toekn.activity-timeout 臨時逾時時間
官方介紹
說實話看到這個介紹我還是有點開心的,因為曾經開發過類似的業務,但是還有什麼比架構本身就支援來得更舒服呢?把逾時時間注釋掉,加上把臨時有效期設定為5s再測試一波。
先登入,再多次查詢登入狀态,不出意外的5s以後掉線了[泣不成聲],趕快看看文檔,文檔裡寫着:在每次直接或間接調用getLoginId()時進行一次過期檢查與續簽操作。想想也對,畢竟在需要身份認證的接口中每次通路都要擷取使用者Id的,沒毛病,暫且先在檢查登入狀态接口擷取一下ID進行傳回,修改代碼再測試。
// 查詢登入狀态,浏覽器通路: http://localhost:9999/user/isLogin
@RequestMapping("isLogin")
public String isLogin() {
return "目前會話是否登入:" + StpUtil.isLogin() + (StpUtil.isLogin() ? "登入的Id:"+StpUtil.getLoginId() : "") ;
}
這次就沒問題了,在不停地重新請求接口的過程中,沒有發生掉線的情況
重新整理接口
在5s無操作之後,再次重新整理
逾時掉線
這時候就正常掉線了,真的很友善。該功能測試完畢,修改成一個常用的逾時時間,開始測試其他配置。
sa-toekn.is-concurrent 同賬号并發登入(多地登入)
這個配置也是一個常用的配置,有些系統同一個賬号同一時間隻允許在一個裝置上登入,有些系統則沒有這樣的限制,現在配置裡增加:
sa-token:
# 是否允許同一賬号并發登入
is-concurrent: true
再利用兩個浏覽器分别執行登陸,檢查登入狀态
可以看到兩個浏覽器都登入成功,并且得到了相同的token值,檢查登入狀态
登入狀态
也可以擷取到相同的登入資訊,我們修改配置為false,再次運作
sa-token:
# 是否允許同一賬号并發登入
is-concurrent: false
首先分别執行登陸
登入情況
再分别檢視登陸狀态
登陸狀态
可以确定,首先登入的那個已經被擠下線了
sa-toekn.is-share 同賬号并發登入是否共用Token
這個也是一個非常實用的功能,如果希望同賬号在不同裝置登陸時享有單獨的逾時時間、裝置标簽等,就可以不共用token,反之就可以公用token,保證賬号一處登出,所有裝置同時下線,增加安全性。
更多配置
官方文檔提供詳盡的配置項表格,有興趣的可以去檢視文檔,可以說是非常實用了。
參數名稱 | 類型 | 預設值 | 說明 |
tokenName | String | satoken | token名稱 (同時也是cookie名稱) |
timeout | long | 2592000 | token有效期,機關/秒 預設30天,-1代表永久有效 參考:token有效期詳解 |
activityTimeout | -1 | token臨時有效期 (指定時間内無操作就視為token過期) 機關: 秒, 預設-1 代表不限制 (例如可以設定為1800代表30分鐘内無操作就過期) 參考:token有效期詳解 | |
isConcurrent | Boolean | true | 是否允許同一賬号并發登入 (為true時允許一起登入, 為false時新登入擠掉舊登入) |
isShare | 在多人登入同一賬号時,是否共用一個token (為true時所有登入共用一個token, 為false時每次登入建立一個token) | ||
isReadBody | 是否嘗試從 請求體 裡讀取 Token | ||
isReadHead | 是否嘗試從 header 裡讀取 Token | ||
isReadCookie | 是否嘗試從 cookie 裡讀取 Token | ||
tokenStyle | uuid | token風格, 參考:自定義Token風格 | |
dataRefreshPeriod | int | 30 | 預設dao層實作類中,每次清理過期資料間隔的時間 (機關: 秒) ,預設值30秒,設定為-1代表不啟動定時清理 |
tokenSessionCheckLogin | 擷取 Token-Session 時是否必須登入 (如果配置為true,會在每次擷取 Token-Session 時校驗是否登入) | ||
autoRenew | 是否打開自動續簽 (如果此值為true, 架構會在每次直接或間接調用 getLoginId() 時進行一次過期檢查與續簽操作) | ||
tokenPrefix | null | token字首, 例如填寫 Bearer 實際傳參 satoken: Bearer xxxx-xxxx-xxxx-xxxx 參考:自定義Token字首 | |
isPrint | 是否在初始化配置時列印版本字元畫 | ||
isLog | false | 是否列印記錄檔 | |
jwtSecretKey | jwt秘鑰 (隻有內建 sa-token-temp-jwt 子產品時此參數才會生效) | ||
idTokenTimeout | 86400 | Id-Token的有效期 (機關: 秒) | |
basic | "" | Http Basic 認證的賬号和密碼 參考:Http Basic 認證 | |
currDomain | 配置目前項目的網絡通路位址 | ||
checkIdToken | 是否校驗Id-Token(部分rpc插件有效) | ||
sso | Object | new SaSsoConfig() | SSO 單點登入相關配置 |
cookie | new SaCookieConfig() | Cookie配置對象 |