今天来记录一下最简单的权限校验实现方式——使用Sa-Token进行权限验证
需要用到的依赖如下:
<!-- Sa-Token 权限认证(Reactor响应式集成), 在线文档:http://sa-token.dev33.cn/ -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.28.0</version>
</dependency>
需要一个配置类来设置过滤规则,例如将login接口的权限验证去掉。
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.interceptor.SaRouteInterceptor;
import cn.dev33.satoken.router.SaHttpMethod;
import cn.dev33.satoken.router.SaRouter;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
// 注册拦截器,文档 https://sa-token.dev33.cn/doc/index.html#/use/route-check
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册Sa-Token的路由拦截器
registry.addInterceptor(new SaRouteInterceptor())
.addPathPatterns("/**")
.excludePathPatterns(
"/swagger-resources/**",
"/swagger-ui.html",
"/v2/api-docs",
"/webjars/**",
"/",
"/cover",
"/login"
);
}
/**
* 注册 [Sa-Token全局过滤器]
*/
// @Bean
public SaServletFilter getSaServletFilter() {
return new SaServletFilter()
// 拦截与排除 path
.addInclude("/**").addExclude("/favicon.ico")
// 全局认证函数
.setAuth(obj -> {
// ...
})
// 异常处理函数
.setError(e -> {
return e.getMessage();
})
// 前置函数:在每次认证函数之前执行
.setBeforeAuth(obj -> {
// ---------- 设置跨域响应头 ----------
SaHolder.getResponse()
// 允许指定域访问跨域资源
.setHeader("Access-Control-Allow-Origin", "*")
// 允许所有请求方式
.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE")
// 有效时间
.setHeader("Access-Control-Max-Age", "3600")
// 允许的header参数
.setHeader("Access-Control-Allow-Headers", "*");
// 如果是预检请求,则立即返回到前端
SaRouter.match(SaHttpMethod.OPTIONS)
.free(r -> System.out.println("--------OPTIONS预检请求,不做处理"))
.back();
})
;
}
}
登录接口也是超级简单
@RequestMapping("login")
public String login() {
StpUtil.login("123");
String token = StpUtil.getTokenValue();
return token;
}
yml配置文件如下:
# Sa-Token 配置
sa-token:
# token名称 (同时也是cookie名称)
token-name: X-Token
# token有效期,单位s 默认30天, -1代表永不过期
timeout: 2592000
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: true
# token风格
token-style: uuid
# 是否输出操作日志
is-log: false
# 是否使用cookie保存token
is-read-cookie: false
# 是否使用head保存token
is-read-head: true
在请求其他接口的时候将登录接口返回的token放到header中X-Token即可。