sa-token 路由拦截式鉴权

简介: sa-token 路由拦截式鉴权

前言

假设我们有如下需求:

24.png

我们怎么实现呢?给每个接口加上鉴权注解?手写全局拦截器?似乎都不是非常方便。

在这个需求中我们真正需要的是一种基于路由拦截的鉴权模式, 那么在sa-token怎么实现路由拦截鉴权呢?


使用方式

1、注册路由拦截器

springboot2.0 为例, 新建配置类MySaTokenConfig.java

@Configuration
public class MySaTokenConfig implements WebMvcConfigurer {
    // 注册sa-token的登录拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册登录拦截器,并排除登录接口地址 
        registry.addInterceptor(new SaRouteInterceptor()).addPathPatterns("/**").excludePathPatterns("/user/doLogin"); 
    }
}

以上代码,我们注册了一个登录验证拦截器,并且排除了 /user/doLogin 接口用来开放登录

那么我们如何进行权限认证拦截呢,且往下看


2、所有拦截器示例


@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("/**");
    }
}

(你不必像上面的示例一样注册所有拦截器,只要按需注册即可 )

3、让我们利用自定义拦截器做点快活的事情

你可以根据路由划分模块,不同模块不同鉴权


@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("/**");
    }
}

4、完整的示例

最终的代码,可能会类似于下面的样子:

@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("/**");
    }
}

JAVA 复制 全屏

相关文章
|
6月前
sa-token实现网关调用认证服务统一鉴权
sa-token实现网关调用认证服务统一鉴权
363 0
|
缓存 小程序 前端开发
【Uniapp】小程序携带Token请求接口+无感知登录方案2.0
【Uniapp】小程序携带Token请求接口+无感知登录方案2.0
328 0
JWT令牌,JWT令牌的后续使用,在其他端口中使用的注意事项?如果你编写了JWT令牌的话,在下一次请求当中,都需要添加的,如果你已经配置好了WebConfig和Inter 就不用配了,添加了拦截器之后
JWT令牌,JWT令牌的后续使用,在其他端口中使用的注意事项?如果你编写了JWT令牌的话,在下一次请求当中,都需要添加的,如果你已经配置好了WebConfig和Inter 就不用配了,添加了拦截器之后
|
4月前
|
安全 NoSQL Java
JWT和Security 登录权限判断和token访问和让token失效
JWT和Security 登录权限判断和token访问和让token失效
|
5月前
|
JSON 前端开发 数据格式
关于JWT令牌和过滤器以及拦截器的实现流程
JWT令牌用于验证用户请求合法性,登录时通过Filter或Interceptor校验账号密码,生成JWT并返回给前端保存。请求时,后端通过解析令牌检查其完整性、时效性和合法性。Filter在请求处理前检查是否携带JWT,Interceptor的preHandle方法同样用于此目的。两者选择其一即可,拦截器配置更精确但稍复杂。
|
6月前
|
JSON 安全 关系型数据库
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
|
6月前
|
存储 缓存 NoSQL
【视频+源码】登录鉴权的三种方式:token、jwt、session实战分享
【视频+源码】登录鉴权的三种方式:token、jwt、session实战分享
126 1
|
6月前
|
存储 JSON 算法
登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)
登录认证-登录校验-会话技术方案选择和对比(cookie、session和JWT令牌)
141 0
|
缓存 小程序 NoSQL
【Uniapp】小程序携带Token请求接口+无感知登录方案
【Uniapp】小程序携带Token请求接口+无感知登录方案
276 0
|
NoSQL Redis
使用黑名单完成,Jwt退出登录操作
使用黑名单完成,Jwt退出登录操作
842 0