springboot如何集成sa-token

714 阅读3分钟

Sa-Token 介绍

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 这是他的官网 so-token

如何在springboot中集成并简单使用sa-token

1. 导入依赖(maven方式)

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot3-starter</artifactId>
    <version>1.40.0</version>
</dependency>

注:如果你使用的是 SpringBoot 2.x,只需要将 sa-token-spring-boot3-starter 修改为 sa-token-spring-boot-starter 即可。

2. 设置配置文件

    
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token: 
    # token 名称(同时也是 cookie 名称)
    token-name: satoken
    # token 有效期(单位:秒) 默认30天,-1 代表永久有效
    timeout: 2592000
    # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
    active-timeout: -1
    # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
    is-concurrent: true
    # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
    is-share: true
    # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
    token-style: uuid
    # 是否输出操作日志 
    is-log: true

3. 使用

sa-token的使用也是非常简单,通常只需调用一个函数就可以实现登录,鉴权的功能.接下来就简单了解一下应用场景吧

  1. 登录
// 会话登录:参数填写要登录的账号id,建议的数据类型:long | int | String, 不可以传入复杂类型,如:User、Admin 等等
StpUtil.login(Object id);   

当前端携带账号密码访问登录接口,时只此一句代码,便可以使会话登录成功,实际上,Sa-Token 在背后做了大量的工作,包括但不限于:

  1. 检查此账号是否之前已有登录;
  2. 为账号生成 Token 凭证与 Session 会话;
  3. 记录 Token 活跃时间;
  4. 通知全局侦听器,xx 账号登录成功;
  5. 将 Token 注入到请求上下文;

Sa-Token 为这个账号创建了一个Token凭证,且通过 Cookie 上下文返回给了前端,接一下的每一次请求,sa-token都会尝试依次从请求头中,cookies中,上下文中获取toke。

提问: 如果是前后端分离项目,如何在登录之后获取该token凭证呢?

回答: 调用 StpUtil.getTokenInfo() 返回当前会话的 token 详细参数

// 第1步,先登录上 
StpUtil.login(10001);
// 第2步,获取 Token  相关参数 
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
// 第3步,返回给前端 
return SaResult.data(tokenInfo);

//前段将得到如下数据
{
    "code": 200,
    "msg": "ok",
    "data": {
        "tokenName": "satoken",           // token名称
        "tokenValue": "e67b99f1-3d7a-4a8d-bb2f-e888a0805633",      // token值
        "isLogin": true,                  // 此token是否已经登录
        "loginId": "10001",               // 此token对应的LoginId,未登录时为null
        "loginType": "login",              // 账号类型标识
        "tokenTimeout": 2591977,          // token剩余有效期 (单位: 秒)
        "sessionTimeout": 2591977,        // Account-Session剩余有效时间 (单位: 秒)
        "tokenSessionTimeout": -2,        // Token-Session剩余有效时间 (单位: 秒) (-2表示系统中不存在这个缓存)
        "tokenActiveTimeout": -1,         // token 距离被冻结还剩的时间 (单位: 秒)
        "loginDevice": "default-device"   // 登录设备类型 
    },
}