1、前言
很多Spring Boot應用使用了Session作為快取,一般會在使用者登入後儲存使用者的關鍵資訊,如:
使用者ID。
使用者名稱。
使用者token。
許可權角色集合。
等等。。。
在管理員修改了使用者的許可權後,希望能立即生效。此時,會發現一個問題,管理員的HTTP請求物件,只能獲取自己的Session物件,而無法獲取使用者的Session物件。這樣對已登入的使用者、或Session未過期的使用者似乎沒有辦法實現動態許可權變更。
當然,並不是真的沒有辦法,通常的做法,可使用Spring Security外掛框架來實現動態許可權變更。
這裡,提供了另一種思路,即利用ServletContext物件的共享特性,來實現使用者許可權變更的資訊傳遞。
2、總體思路
建立一個使用者變更字典globalChangeMap(Map<Integer,Integer>型別)作為userId與changeFlag的對映關係,其中changeFlag暫時沒有意義。如果需要通知資訊型別超過1種,不足32種,可將changeFlag按位編碼,每位表示一種變更型別。還是先假設只有許可權變更這一種型別。
對globalChangeMap作為核心進行封裝,作為變更服務類ChangeService,提供必要的介面方法。
將ChangeService加入ServletContext物件中,實現全域性共享。
如果管理員修改了某個使用者的許可權後,則在globalChangeMap中加入一條變更資料。
而AuthorizationAspect切面類,該切面類負責token認證、許可權認證。現在先檢查globalChangeMap有無變更記錄,如果有,表示要查詢並更新使用者許可權,並將新的許可權角色集合更新到Session中,最後移除globalChangeMap中該使用者的變更資料。對於本次攔截的請求,則可根據新的許可權配置進行處理。