sa-token笔记

SpringBoot项目集成

一、文档

https://sa-token.cc/doc.html#/start/example

二、要点

  1. 引入依赖
  2. 配置文件
  3. 开始使用

分布式项目集成

Sa-Token 默认将数据保存在内存中,此模式读写速度最快,且避免了序列化与反序列化带来的性能消耗,但是此模式也有一些缺点,比如:

  1. 重启后数据会丢失。
  2. 无法在分布式环境中共享数据。

为此,Sa-Token 提供了扩展接口,你可以轻松将会话数据存储在一些专业的缓存中间件上(比如 Redis), 做到重启数据不丢失,而且保证分布式环境下多节点的会话一致性。

依赖

xml 复制代码
<!-- Sa-Token 整合 RedisTemplate -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-redis-template</artifactId>
    <version>1.44.0</version>
</dependency>

<!-- 提供 Redis 连接池 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

配置

yaml 复制代码
spring: 
    # redis配置 
    redis:
        # Redis数据库索引(默认为0)
        database: 1
        # Redis服务器地址
        host: 127.0.0.1
        # Redis服务器连接端口
        port: 6379
        # Redis服务器连接密码(默认为空)
        # password: 
        # 连接超时时间
        timeout: 10s
        lettuce:
            pool:
                # 连接池最大连接数
                max-active: 200
                # 连接池最大阻塞等待时间(使用负值表示没有限制)
                max-wait: -1ms
                # 连接池中的最大空闲连接
                max-idle: 10
                # 连接池中的最小空闲连接
                min-idle: 0

集成 Redis 后,是我额外手动保存数据,还是框架自动保存?

框架自动保存。集成 Redis 只需要引入对应的 pom依赖 即可,框架所有上层 API 保持不变。

或者跟若依框架一样,实现SaTokenDao,自定义DAO会影响Sa-Token核心的存储行为。原先的实现类是SaTokenDaoDefaultImpl使用内存进行登录用户信息的存储操作,现在重写后可以使用Redis进行。

java 复制代码
public class PlusSaTokenDao implements SaTokenDao {

    /**
     * 获取Value,如无返空
     */
    @Override
    public String get(String key) {
        return RedisUtils.getCacheObject(key);
    }

    /**
     * 写入Value,并设定存活时间 (单位: 秒)
     */
    @Override
    public void set(String key, String value, long timeout) {
        if (timeout == 0 || timeout <= SaTokenDao.NOT_VALUE_EXPIRE) {
            return;
        }
        // 判断是否为永不过期
        if (timeout == SaTokenDao.NEVER_EXPIRE) {
            RedisUtils.setCacheObject(key, value);
        } else {
            RedisUtils.setCacheObject(key, value, Duration.ofSeconds(timeout));
        }
    }
    。。。
}

前后端分离

在app、小程序等前后端分离场景中,一般是没有 Cookie 这一功能的,此时大多数人都会一脸懵逼,咋进行鉴权啊?

见招拆招,其实答案很简单:

不能后端控制写入了,就前端自己写入。(难点在后端如何将 Token 传递到前端)

每次请求不能自动提交了,那就手动提交。(难点在前端如何将 Token 传递到后端,同时后端将其读取出来)

1、后端将 token 返回到前端

java 复制代码
// 登录接口
@RequestMapping("doLogin")
public SaResult doLogin() {
    // 第1步,先登录上 
    StpUtil.login(10001);
    // 第2步,获取 Token  相关参数 tokenName和tokenValue
    SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
    // 第3步,返回给前端 
    return SaResult.data(tokenInfo);
}

2、前端将 token 提交到后端

无论是app还是小程序,其传递方式都大同小异。

那就是,将 token 塞到请求header里 。

鉴权

你需要做的就是新建一个类,实现 StpInterface接口,例如以下代码:

java 复制代码
/**
 * 自定义权限加载接口实现类
 */
@Component    // 保证此类被 SpringBoot 扫描,完成 Sa-Token 的自定义权限验证扩展 
public class StpInterfaceImpl implements StpInterface {

    /**
     * 返回一个账号所拥有的权限码集合 
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 本 list 仅做模拟,实际项目中要根据具体业务逻辑来查询权限
        List<String> list = new ArrayList<String>();    
        list.add("101");
        list.add("user.add");
        list.add("user.update");
        list.add("user.get");
        // list.add("user.delete");
        list.add("art.*");
        return list;
    }

    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 本 list 仅做模拟,实际项目中要根据具体业务逻辑来查询角色
        List<String> list = new ArrayList<String>();    
        list.add("admin");
        list.add("super-admin");
        return list;
    }

}
相关推荐
带刺的坐椅2 个月前
Solon 权限认证之 Sa-Token 的使用与详解
java·sa-token·web·solon
黎黎黎明⁠⁢5 个月前
SpringBoot整合Sa-Token:实现RBAC权限模型
java·sa-token·springboot·idea
孔明click335 个月前
Sa-Token v1.43.0 发布 🚀,新增 SSO 单设备注销、消息推送,多 Access-Token 并存能力
java·sa-token·springboot·登录·权限认证
孔明click336 个月前
Sa-Token v1.42.0 发布 🚀,新增 API Key、TOTP 验证码、RefreshToken 反查等能力
java·sa-token·springboot·登录·权限·权限认证
向阳2567 个月前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
孔明click337 个月前
Sa-Token v1.41.0 发布 🚀,来看看有没有令你心动的功能!
java·sa-token·springboot·登录·权限·权限认证
孔明click339 个月前
Sa-Token v1.40.0 发布 🚀,来看看有没有令你心动的功能!
java·sa-token·springboot·权限·权限认证
会说话的小鱼1 年前
UNI-SOP应用场景(1)- 纯前端预开发
前端·spring·sa-token·登录·sso
Damon小智1 年前
SpringBoot权限认证-Sa-Token的使用与详解
java·spring boot·spring cloud·微服务·sa-token