sa-token 路由攔截式鑑權

前言

假設咱們有以下需求: 在這裏插入圖片描述 咱們怎麼實現呢?給每一個接口加上鑑權註解?手寫全局攔截器?彷佛都不是很是方便。 在這個需求中咱們真正須要的是一種基於路由攔截的鑑權模式, 那麼在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"); 
   }
}


以上代碼,咱們註冊了一個登陸驗證攔截器,而且排除了 /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("/**");
 }
}

寫在最後

源碼開源,做者不易,若是你喜歡這個框架麻煩你隨手點一顆小星星哦!

image

相關文章
相關標籤/搜索