假設咱們有以下需求: 咱們怎麼實現呢?給每一個接口加上鑑權註解?手寫全局攔截器?彷佛都不是很是方便。 在這個需求中咱們真正須要的是一種基於路由攔截的鑑權模式, 那麼在sa-token怎麼實現路由攔截鑑權呢?java
以 springboot2.0 爲例, 新建配置類MySaTokenConfig.javagit
@Configuration public class MySaTokenConfig implements WebMvcConfigurer { // 註冊sa-token的登陸攔截器 @Override public void addInterceptors(InterceptorRegistry registry) { // 註冊登陸攔截器,並排除登陸接口地址 registry.addInterceptor(new SaRouteInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/doLogin"); } }
@Configuration public class MySaTokenConfig implements WebMvcConfigurer { // 註冊sa-token的全部攔截器 @Override public void addInterceptors(InterceptorRegistry registry) { // 註冊一個登陸驗證攔截器 registry.addInterceptor(SaRouteInterceptor.createLoginVal()).addPathPatterns("/**").excludePathPatterns("/user/doLogin"); // 註冊一個角色認證攔截器 registry.addInterceptor(SaRouteInterceptor.createRoleVal("super-admin")).addPathPatterns("/**"); // 註冊一個權限認證攔截器 registry.addInterceptor(SaRouteInterceptor.createPermissionVal("user:add", "user:deelete")).addPathPatterns("/UserController/**"); // 註冊一個自定義認證攔截器 (能夠寫任意認證代碼) registry.addInterceptor(new SaRouteInterceptor((request, response, handler)->{ System.out.println("---------- 進入自定義認證 --------------- "); // 你能夠在這裏寫任意認證代碼, 例如: StpUtil.checkLogin(); })).addPathPatterns("/**"); } }
@Configuration public class MySaTokenConfig implements WebMvcConfigurer { // 註冊sa-token的全部攔截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new SaRouteInterceptor((request, response, handler)->{ // 根據路由劃分模塊,不一樣模塊不一樣鑑權 SaRouterUtil.match("/user/**", () -> StpUtil.checkPermission("user")); SaRouterUtil.match("/admin/**", () -> StpUtil.checkPermission("admin")); SaRouterUtil.match("/goods/**", () -> StpUtil.checkPermission("goods")); SaRouterUtil.match("/orders/**", () -> StpUtil.checkPermission("orders")); SaRouterUtil.match("/notice/**", () -> StpUtil.checkPermission("notice")); SaRouterUtil.match("/comment/**", () -> StpUtil.checkPermission("comment")); })).addPathPatterns("/**"); } }
最終的代碼,可能會相似於下面的樣子:github
@Configuration public class MySaTokenConfig implements WebMvcConfigurer { // 註冊sa-token的攔截器 @Override public void addInterceptors(InterceptorRegistry registry) { // 自定義驗證攔截器 registry.addInterceptor(new SaRouteInterceptor((request, response, handler) -> { // 登陸驗證 -- 攔截全部路由,並排除/user/doLogin 用於開放登陸 SaRouterUtil.match("/**", "/user/doLogin", () -> StpUtil.checkLogin()); // 角色認證 -- 攔截以 admin 開頭的路由,必須具有[admin]角色或者[super-admin]角色才能夠經過認證 SaRouterUtil.match("/admin/**", () -> StpUtil.checkRoleOr("admin", "super-admin")); // 權限認證 -- 不一樣模塊, 校驗不一樣權限 SaRouterUtil.match("/user/**", () -> StpUtil.checkPermission("user")); SaRouterUtil.match("/admin/**", () -> StpUtil.checkPermission("admin")); SaRouterUtil.match("/goods/**", () -> StpUtil.checkPermission("goods")); SaRouterUtil.match("/orders/**", () -> StpUtil.checkPermission("orders")); SaRouterUtil.match("/notice/**", () -> StpUtil.checkPermission("notice")); SaRouterUtil.match("/comment/**", () -> StpUtil.checkPermission("comment")); // 匹配RESTful風格路由 SaRouterUtil.match("/article/get/{id}", () -> StpUtil.checkPermission("article")); })).addPathPatterns("/**"); } }