SaToken - 4. 框架配置 - 集成Redis

1. Sa-Token 框架配置


1. 配置方式 yml

############## 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

2. 代码方式

/**
 * Sa-Token 配置类
 */
@Configuration
public class SaTokenConfigure {
    // Sa-Token 参数配置,参考文档:https://sa-token.cc
    // 此配置会覆盖 application.yml 中的配置
    @Bean
    @Primary
    public SaTokenConfig getSaTokenConfigPrimary() {
        SaTokenConfig config = new SaTokenConfig();
        config.setTokenName("satoken");             // token 名称(同时也是 cookie 名称)
        config.setTimeout(30 * 24 * 60 * 60);       // token 有效期(单位:秒),默认30天,-1代表永不过期 
        config.setActiveTimeout(-1);              // token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
        config.setIsConcurrent(true);               // 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录)
        config.setIsShare(true);                    // 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token)
        config.setTokenStyle("uuid");               // token 风格
        config.setIsLog(false);                     // 是否输出操作日志 
        return config;
    }
}
/**
 * Sa-Token 配置类
 */
@Configuration
public class SaTokenConfigure {
    // Sa-Token 参数配置,参考文档:https://sa-token.cc
    // 此配置会与 application.yml 中的配置合并 (代码配置优先)
    @Autowired
    public void configSaToken(SaTokenConfig config) {
        config.setTokenName("satoken");             // token 名称(同时也是 cookie 名称)
        config.setTimeout(30 * 24 * 60 * 60);       // token 有效期(单位:秒),默认30天,-1代表永不过期 
        config.setActiveTimeout(-1);              // token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
        config.setIsConcurrent(true);               // 是否允许同一账号多地同时登录(为 true 时允许一起登录,为 false 时新登录挤掉旧登录)
        config.setIsShare(true);                    // 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token)
        config.setTokenStyle("uuid");               // token 风格
        config.setIsLog(false);                     // 是否输出操作日志 
    }
}

3. 核心包所有可配置项

参数名称类型默认值说明
tokenNameStringsatokenToken 名称 (同时也是 Cookie 名称、数据持久化前缀)
timeoutlong2592000Token 有效期(单位:秒),默认30天,-1代表永不过期 参考:token有效期详解
activeTimeoutlong-1Token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结(例如可以设置为1800代表30分钟内无操作就冻结) 参考:token有效期详解
dynamicActiveTimeoutBooleanfalse是否启用动态 activeTimeout 功能,如不需要请设置为 false,节省缓存请求次数
isConcurrentBooleantrue是否允许同一账号并发登录 (为 true 时允许一起登录,为 false 时新登录挤掉旧登录)
isShareBooleantrue在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token,为 false 时每次登录新建一个 token,login 时提供了 Extra 数据后,即使配置了为 true 也不能复用旧 Token,必须创建新 Token)
maxLoginCountint12同一账号最大登录数量,-1代表不限 (只有在 isConcurrent=trueisShare=false 时此配置才有效),详解
maxTryTimesint12在每次创建 Token 时的最高循环次数,用于保证 Token 唯一性(-1=不循环重试,直接使用)
isReadBodyBooleantrue是否尝试从 请求体 里读取 Token
isReadHeaderBooleantrue是否尝试从 header 里读取 Token
isReadCookieBooleantrue是否尝试从 cookie 里读取 Token,此值为 false 后,StpUtil.login(id) 登录时也不会再往前端注入Cookie
isWriteHeaderBooleanfalse是否在登录后将 Token 写入到响应头
tokenStyleStringuuidtoken风格, 参考:自定义Token风格
dataRefreshPeriodint30默认数据持久组件实现类中,每次清理过期数据间隔的时间 (单位: 秒) ,默认值30秒,设置为-1代表不启动定时清理
tokenSessionCheckLoginBooleantrue获取 Token-Session 时是否必须登录 (如果配置为true,会在每次获取 Token-Session 时校验是否登录),详解
autoRenewBooleantrue是否打开自动续签 (如果此值为true,框架会在每次直接或间接调用 getLoginId() 时进行一次过期检查与续签操作),参考:token有效期详解
tokenPrefixStringnulltoken前缀,例如填写 Bearer 实际传参 satoken: Bearer xxxx-xxxx-xxxx-xxxx 参考:自定义Token前缀
isPrintBooleantrue是否在初始化配置时打印版本字符画
isLogBooleanfalse是否打印操作日志
logLevelStringtrace日志等级(trace、debug、info、warn、error、fatal),此值与 logLevelInt 联动
logLevelIntint1日志等级 int 值(1=trace、2=debug、3=info、4=warn、5=error、6=fatal),此值与 logLevel 联动
isColorLogBooleannull是否打印彩色日志,true=打印彩色日志,false=打印黑白日志,null=框架根据运行终端自行判断是否打印彩色日志
jwtSecretKeyStringnulljwt秘钥 (只有集成 sa-token-temp-jwt 模块时此参数才会生效),参考:和 jwt 集成
sameTokenTimeoutlong86400Same-Token的有效期 (单位: 秒),参考:内部服务外网隔离
basicString“”Http Basic 认证的账号和密码 参考:Http Basic 认证
currDomainStringnull配置当前项目的网络访问地址
checkSameTokenBooleanfalse是否校验Same-Token(部分rpc插件有效)
cookieObjectnew SaCookieConfig()Cookie 配置对象
signObjectnew SaSignConfig()API 签名配置对象

2. Sa-Token 集成Redis


Sa-Token 集成 Redis之后, token / session 等信息自动存储到指定Redis中

1. Sa-Token 集成 Redis (JDK序列化)

  • Session 序列化后基本不可读,对开发者来讲等同于乱码
<!-- Sa-Token 整合 Redis (使用 jdk 默认序列化方式) -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-redis</artifactId>
    <version>1.39.0</version>
</dependency>

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

2. (推荐) Sa-Token 集成 Redis (Jackson序列化)

<!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-redis-jackson</artifactId>
    <version>1.39.0</version>
</dependency>

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

3. yml 配置

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

### 如何实现 Sa-Token 与 Redis 集成 #### 使用场景 在分布式环境中,为了提高性能并保持会话的一致性,通常会选择将 Session 数据存储到集中式的缓存系统中,比如 Redis。对于基于 Spring Cloud 或其他微服务框架构建的应用程序来说,通过引入 Sa-Token 并将其与 Redis 结合起来可以很好地满足这一需求[^1]。 #### 实现步骤概述 #### 添加依赖项 要在项目里集成 Sa-Token 和 Redis 支持,在 `pom.xml` 文件内加入如下 Maven 依赖: ```xml <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>x.x.x</version> <!-- 替换成最新版本号 --> </dependency> <!-- 如果使用的是SpringBoot2.x以上,则还需要添加redis starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` #### 配置文件设置 编辑 application.yml (或 .properties),指定 Redis 连接参数以及开启 Sa-Token 对 Redis 的支持: ```yaml server: port: 8080 spring: redis: host: localhost port: 6379 sa-token: token-name: satoken timeout: 2592000 # Token有效期,默认单位秒(30天) is-concurrent: true # 是否允许同一账号并发登录 kickout-after-login: false # 登录成功后踢掉之前的token cache-type: redis # 设置Token的持久化方式为Redis模式 ``` #### 自定义 StpLogicImpl 类 创建一个新的 Java 类继承自 `com.baomidou.mybatisplus.core.handlers.SuperMapperHandler` 接口,并重写其中的方法来自定义逻辑处理过程;特别是要覆盖 getLoginId() 方法用于从当前请求上下文中提取用户的唯一标识符[^4]: ```java import cn.dev33.satoken.stp.StpLogic; import org.springframework.stereotype.Component; @Component public class MyStpLogic extends StpLogic { @Override public Object getLoginIdDefault(Object loginType) { // 返回null表示不拦截任何未登录访问, 可自行修改此行为 return null; } } ``` #### 编写测试控制器 最后编写一个简单的 RESTful API 控制器来验证整个流程是否正常工作: ```java @RestController @RequestMapping("/api/user") public class UserController { private static final Logger logger = LoggerFactory.getLogger(UserController.class); @GetMapping("/info") public Map<String,Object> info(){ HashMap<String, Object> map = new HashMap<>(); Long userId = StpUtil.getLoginIdAsLong(); String username = StpUtil.getLoginIdAsString(); map.put("userId", userId); map.put("username", username); return map; } @PostMapping("/login") public void login(@RequestParam String account,@RequestParam String password){ if ("test".equals(account)&& "123456".equals(password)){ StpUtil.login(account); }else{ throw new RuntimeException("用户名密码错误"); } } } ``` 上述代码片段展示了如何利用 Sa-Token 提供的功能完成基本的身份验证操作并将用户信息保存至 Redis 中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值