1、Sa-token的文档还是很清晰的,直接按照文档来就可以了,首先在Springboot项目中添加依赖
代码语言:javascript复制<!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.34.0</version>
</dependency>
2、然后配置sa-token相关的参数:
代码语言:javascript复制sa-token:
# token名称 (同时也是cookie名称)
token-name: 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: true
3、Sa-Token 提供了扩展接口可以把token和session信息存储在Redis中,这里就按照文档集成进来,引入依赖
代码语言:javascript复制<!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-dao-redis-jackson</artifactId>
<version>1.34.0</version>
</dependency>
<!-- 提供Redis连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
4、引入redis相关的依赖后,还需要配置一下redis相关的信息,如下:
代码语言:javascript复制 Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
# spring.redis.password=
# 连接超时时间
spring.redis.timeout=10s
# 连接池最大连接数
spring.redis.lettuce.pool.max-active=200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0
5、添加路由拦截鉴权:SaTokenConfigure,这里排除登陆请求(/user/login)
代码语言:javascript复制/**
* @author felix
*/
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
try {
// 注册 Sa-Token 拦截器,校验规则为 StpUtil.checkLogin() 登录校验。
registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
.addPathPatterns("/**")
.excludePathPatterns("/user/login");
}catch (NotLoginException e){
}
}
}
6、添加一个全局的异常处理器:GlobalExceptionHandler
代码语言:javascript复制@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler
public ResponseData handlerException(Exception e) {
if (e instanceof NotLoginException) {
Map<String,Object> data=new HashMap<>();
ResponseData responseData = new ResponseData();
data.put("code",401);
data.put("message",e.getMessage());
responseData.setData(data);
return responseData;
}
return ResponseData.failure("服务器异常");
}
}
7、sa-token鉴权用法,user/login接口如果判断登陆成功则调用StpUtil.login(Object id)实现登陆认证,user/isLogin接口是判断用户是否是登陆状态的,只需要StpUtil.isLogin()就可以判断用户是否登陆状态
代码语言:javascript复制// 会话登录:参数填写要登录的账号id,建议的数据类型:long | int | String, 不可以传入复杂类型,如:User、Admin 等等
StpUtil.login(Object id);
// 当前会话注销登录
StpUtil.logout();
// 获取当前会话是否已经登录,返回true=已登录,false=未登录
StpUtil.isLogin();
// 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`
StpUtil.checkLogin();
8、接口请求结果验证:未登陆状态请求:/user/isLogin
调用登陆接口 /user/login
9、注解鉴权的使用:
代码语言:javascript复制// 登录校验:只有登录之后才能进入该方法
@SaCheckLogin
@RequestMapping("info")
public String info() {
return "查询用户信息";
}
// 角色校验:必须具有指定角色才能进入该方法
@SaCheckRole("admin")
@RequestMapping("add")
public String add() {
return "只有admin角色才能 添加用户";
}
// 权限校验:必须具有指定权限才能进入该方法
@SaCheckPermission("user-add")
@RequestMapping("add")
public String add() {
return "用户增加";
}
// 二级认证校验:必须二级认证之后才能进入该方法
@SaCheckSafe()
@RequestMapping("add")
public String add() {
return "用户增加";
}
// Http Basic 校验:只有通过 Basic 认证后才能进入该方法
@SaCheckBasic(account = "sa:123456")
@RequestMapping("add")
public String add() {
return "用户增加";
}
// 校验当前账号是否被封禁 comment 服务,如果已被封禁会抛出异常,无法进入方法
@SaCheckDisable("comment")
@RequestMapping("send")
public String send() {
return "查询用户信息";
}