YC-Framework鑑權主要基於Dromara開源社群組織下的Sa-Token。
Sa-Token是一個輕量級Java許可權認證框架,主要解決:登入認證、許可權認證、Session對談、單點登入、OAuth2.0、微服務閘道器鑑權等一系列許可權相關問題。
我在從單體架構到分散式微服務架構的思考這篇文章中所強調技術選型的八點如業務相關性、框架流行度、學習曲線、檔案豐富程度、社群支援、單元測試、可延伸性、許可證等。Sa-Token均滿足。
Sa-Token官方檔案:
https://sa-token.dev33.cn/doc/
Sa-Token Github原始碼:
https://github.com/dromara/sa-token
Sa-Token Gitee原始碼:
https://gitee.com/dromara/sa-token
基本上結合自己的業務需求,整體過一遍Sa-Token官方檔案,就能學會如何使用Sa-Token。
開源不易,如果Sa-Token對你幫助,不妨點個star鼓勵一下對應的開源小夥伴們!!!
主要步驟如下:
啟動完畢以後,通過瀏覽器存取本地地址:
http://localhost:8080/doc.html
接下來點選認證管理會出現如下列表,找到登入介面,輸入對應的資訊,如下所示,就表示登入成功:
YC-Framework中的鑑權模組叫yc-common-security,屬於yc-common模組下的子模組。如圖所示:
其中核心類叫SaTokenConfigure.java,程式碼如下:
@Configuration @Slf4j public class SaTokenConfigure implements WebMvcConfigurer, StpInterface { @Autowired private UserApi userApi; /** * 註冊攔截器 */ @Override public void addInterceptors(InterceptorRegistry registry) { // 註冊路由攔截器,自定義驗證規則 registry.addInterceptor(new SaRouteInterceptor((request, response, handler) -> { //登入認證 SaRouter.match("/**", () -> StpUtil.checkLogin()); // 角色認證 -- 攔截以 admin 開頭的路由,必須具備 admin 角色或者 super-admin 角色才可以通過認證 SaRouter.match("/company/**", () -> StpUtil.checkRoleOr("admin", "super-admin")); //許可權認證 SaRouter.match("/company/**", () -> StpUtil.checkPermission("company")); SaRouter.match("/user/**", () -> StpUtil.checkPermission("admin")); SaRouter.match("/role/**", () -> StpUtil.checkPermission("admin")); })).addPathPatterns("/**").excludePathPatterns( "/auth/**", "/doc.html", "/webjars/**", "/swagger-resources", "/actuator/**"); } @Override public List<String> getPermissionList(Object loginId, String loginType) { log.info("loginId:" + loginId + "||" + loginType); List<String> permList = new ArrayList<>(); UserIdReqDTO permReq = new UserIdReqDTO(); permReq.setUserId(handleUserId(loginId.toString())); RespBody<List<String>> resultBody = userApi.getPerm(permReq); if (RespCode.SELECT_SUCCESS.getCode().equals(resultBody.getCode())) { permList = resultBody.getData(); } return permList; } @Override public List<String> getRoleList(Object loginId, String loginType) { log.info("loginId:" + loginId + "||" + loginType); List<String> roleList = new ArrayList<>(); UserIdReqDTO permReq = new UserIdReqDTO(); permReq.setUserId(handleUserId(loginId.toString())); RespBody<List<String>> resultBody = userApi.getRole(permReq); if (RespCode.SELECT_SUCCESS.getCode().equals(resultBody.getCode())) { roleList = resultBody.getData(); } return roleList; } /** * 處理使用者ID * * @param userId * @return */ private String handleUserId(String userId) { return userId.substring(userId.lastIndexOf(ApplicationConst.DEFAULT_FLAG) + 1).replace(ApplicationConst.DEFAULT_FLAG, ApplicationConst.NULL_STR); } }
該程式碼存放目錄為:
https://github.com/developers-youcong/yc-framework/tree/main/yc-common/yc-common-security
不難看出基於攔截器相關。之前寫過一篇叫Java Web之三大利器的文章,所謂Java Web 三大利器指的是攔截器、過濾器、監聽器等。其中攔截器與過濾器在許可權認證相關用的比較多。
之前還寫過關於重構某網API服務的文章可供讀者朋友參考,這篇文章是基於公司系統許可權重構的背景,在此我提供了兩種方法,一種是基於原生的攔截器,另外一方面是基於Sa-Token。
一方面符合YC-Framework的架構思想之一模組化;另外一方面在於按需引入,哪一個微服務需要,只需引入對應的依賴即可。如下所示:
<dependency> <groupId>com.yc.framework</groupId> <artifactId>yc-common-security</artifactId> </dependency>