pom.xml
<properties>
<sa.token.version>1.37.0</sa.token.version>
</properties>
<!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>${sa.token.version}</version>
</dependency>
<!-- Sa-Token 整合 jwt -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-jwt</artifactId>
<version>${sa.token.version}</version>
</dependency>
aplication-dev.yml
若需要其他配置可参考官网:sa-token.cc/doc.html#/s…
sa-token:
jwt-secret-key: jZK1dtli8qcsp52zgp+UcylEDtjWSw2C2IzYq+h0A8qVn5hi2TQux0W3L4yzb/fAfFB28tGO+fq+L9zWVbw7pw==
# timeout: 28800
active-timeout: -1
satoken 整合 jwt
项目的 /global/config 下整合 jwt
整合后生成的 token 才是jwt风格
import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.stp.StpLogic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SaTokenConfiguration {
// Sa-Token 整合 jwt (Simple 简单模式)
@Bean
public StpLogic getStpLogicJwt() {
return new StpLogicJwtForSimple();
}
}
登录认证
@Override
public Map<String, String> login(String account, String password) {
// 校验用户密码是否正确,可根据实际情况判断
if ("wang".equals(account) && "123456".equals(password)) {
SaLoginModel loginUserInfo = getLoginUserInfo();
// 第1步,先登录上。Token挂载的扩展参数 (此方法只有在集成jwt插件时才会生效)
StpUtil.login(sysUser.getId(), loginUserInfo);
// 第2步,获取 Token 相关参数
String token = StpUtil.getTokenValueByLoginId(sysUser.getId());
System.out.println(token);
// 3. 登录后设置 token session 信息
StpUtil.getTokenSession().set("userInfo", loginUserInfo);
// 4. 返回 token 信息
Map<String, String> result = new HashMap<>();
result.put("satoken", token);
return result;
}
system.error.println("用户名或密码不正常");
return null;
}
private SaLoginModel getLoginUserInfo() {
SaLoginModel saLoginModel = new SaLoginModel();
saLoginModel.setExtra("id", 1);
saLoginModel.setExtra("name", "wangxxx");
return saLoginModel;
}
其他方法
除了登录方法,我们可能还需要:
// 当前会话注销登录
StpUtil.logout();
// 获取当前会话是否已经登录,返回true=已登录,false=未登录
StpUtil.isLogin();
// 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`
StpUtil.checkLogin();
NotLoginException 异常场景
在会话未登录的情况下尝试获取loginId会使框架抛出NotLoginException异常,而同为未登录异常却有五种抛出场景的区分
| 场景值 | 对应常量 | 含义说明 |
|---|---|---|
| -1 | NotLoginException.NOT_TOKEN | 未能从请求中读取到有效 token |
| -2 | NotLoginException.INVALID_TOKEN | 已读取到 token,但是 token 无效 |
| -3 | NotLoginException.TOKEN_TIMEOUT | 已读取到 token,但是 token 已经过期 (详) |
| -4 | NotLoginException.BE_REPLACED | 已读取到 token,但是 token 已被顶下线 |
| -5 | NotLoginException.KICK_OUT | 已读取到 token,但是 token 已被踢下线 |
| -6 | NotLoginException.TOKEN_FREEZE | 已读取到 token,但是 token 已被冻结 |
| -7 | NotLoginException.NO_PREFIX | 未按照指定前缀提交 token |