SaToken是一个基于Java的轻量级权限认证框架,专注于处理Token相关操作,如生成、校验、刷新和过期处理等。它提供了高度灵活的扩展接口,支持多种业务场景,如单点登录和权限控制。本文将详细介绍SaToken的功能、安装方法、基础使用和进阶功能,提供丰富的SaToken资料。
SaToken简介SaToken是什么
SaToken 是一个基于 Java 语言的轻量级权限认证框架,专门用于处理 Token 相关的操作,如生成、校验、刷新、过期处理等。它提供了高度灵活的扩展接口,使得开发者可以根据需求定制各种业务场景,如单点登录、权限控制、Token 黑名单等。
SaToken的主要功能和优势
- 轻量级设计:SaToken 不依赖任何第三方库,体积小巧,易于集成,启动速度更快。
- 高度灵活性:支持自定义过期时间、刷新时间、黑名单策略等,能够适应多种业务场景。
- 丰富的拓展接口:提供大量的扩展接口,开发者可以轻易实现单点登录、权限控制等复杂功能。
- 高性能:SaToken 在每次请求时仅需毫秒级的处理时间,适合高并发场景。
- 简单易用:通过简单的 API 调用即可完成 Token 的生成、校验、刷新等操作。
- 易于维护:源代码结构清晰,易于理解和维护。
安装SaToken的准备工作
在安装 SaToken 之前,需要确保满足以下条件:
- Java 环境已经安装并配置好,建议使用 Java 8 及以上版本。
- Spring Boot 或 Spring MVC 环境已搭建好。
SaToken安装的步骤详解
- 导入依赖:在 Maven 项目中,需要在
pom.xml
文件中添加 SaToken 的依赖。
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>satoken-spring-boot-starter</artifactId>
<version>1.5.0</version>
</dependency>
- 配置 SaToken:在
application.yml
或application.properties
文件中进行 SaToken 配置。
satoken:
start:
enable: true
allowIp: 0.0.0.0 # 放行 IP,0.0.0.0 表示放行所有
allowMethod: * # 放行方法,* 表示放行所有
allowUrl: /hello # 放行 URL,/hello 表示放行所有 /hello 开头的接口
allowHeader: * # 放行 Header,* 表示放行所有 Header
allowParam: * # 放行 Param,* 表示放行所有 Param
allowCookie: * # 放行 Cookie,* 表示放行所有 Cookie
allowToken: * # 放行 Token,* 表示放行所有 Token
allowSession: * # 放行 Session,* 表示放行所有 Session
- 初始化 SaToken:在 Spring Boot 项目中,可以在
@SpringBootApplication
类中添加@SatokenEnable
注解以启用 SaToken。
import cn.dev33.satoken.starter.SatokenEnable;
@SpringBootApplication
@SatokenEnable
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
SaToken基础使用教程
获取Token的基本方法
在 SaToken 中,获取 Token 的基本方法十分简单,可以通过 SaToken
类的 createToken
方法来生成一个新的 Token,并通过 SaToken
类的 getLoginToken
方法来获取当前用户的 Token。
import cn.dev33.satoken.starter.SaToken;
import cn.dev33.satoken.starter.SaTokenManager;
public class TokenUtil {
public static void main(String[] args) {
// 创建 SaTokenManager 实例
SaTokenManager manager = SaTokenManager.me();
// 获取 Token
String token = SaToken.createToken();
System.out.println("生成的 Token 为: " + token);
// 保存 Token
manager.setLoginToken("user123", token);
// 获取当前用户的 Token
String userToken = manager.getLoginToken("user123");
System.out.println("当前用户的 Token 为: " + userToken);
}
}
使用Token进行身份验证
在实际应用中,通常需要在每次请求时验证用户的 Token 是否有效。SaToken 提供了 Sa
类的 isLogin
方法来判断 Token 是否有效,Sa
类的 getLoginId
方法来获取登录的用户 ID。
import cn.dev33.satoken.starter.Sa;
import cn.dev33.satoken.starter.SaTokenManager;
public class TokenValidator {
public static void main(String[] args) {
// 验证 Token 是否有效
boolean isValid = Sa.isLogin();
System.out.println("Token 是否有效: " + isValid);
// 获取当前登录的用户 ID
String userId = Sa.getLoginId();
System.out.println("当前登录的用户 ID 为: " + userId);
// 从数据库或缓存中获取用户信息
// User user = userRepository.findById(userId);
}
}
Token刷新的基本方法
Token 刷新机制允许在 Token 即将过期时自动刷新 Token,从而延长用户登录状态的持续时间。可以通过 SaTokenManager
类的 setLoginTokenTimeout
方法来设置刷新 Token 的过期时间。
import cn.dev33.satoken.starter.SaToken;
import cn.dev33.satoken.starter.SaTokenManager;
public class TokenRefresher {
public static void main(String[] args) {
// 创建 SaTokenManager 实例
SaTokenManager manager = SaTokenManager.me();
// 设置 Token 的过期时间为 10 分钟
SaTokenManager.me().setLoginTokenTimeout(600);
// 生成 Token
String token = SaToken.createToken();
// 保存 Token
manager.setLoginToken("user123", token);
// 获取当前用户的 Token
String userToken = manager.getLoginToken("user123");
System.out.println("当前用户的 Token 为: " + userToken);
// 刷新 Token
manager.setLoginToken("user123", SaToken.createToken());
System.out.println("刷新后的 Token 为: " + manager.getLoginToken("user123"));
}
}
权限控制的基本方法
SaToken 支持基于 Token 的权限控制,允许开发者根据 Token 中携带的权限信息来控制用户对资源的访问。可以通过自定义的权限接口来实现这一功能。
import cn.dev33.satoken.starter.Sa;
import cn.dev33.satoken.starter.SaTokenManager;
public class PermissionControl {
public static void main(String[] args) {
// 验证 Token 是否有效
boolean isValid = Sa.isLogin();
System.out.println("Token 是否有效: " + isValid);
// 获取当前登录的用户 ID
String userId = Sa.getLoginId();
System.out.println("当前登录的用户 ID 为: " + userId);
// 验证用户是否有访问特定资源的权限
if (hasPermission(userId, "resource1")) {
System.out.println("用户有权访问资源1");
} else {
System.out.println("用户无权访问资源1");
}
}
private static boolean hasPermission(String userId, String resource) {
// 模拟权限验证逻辑
// 可以从数据库或缓存中获取权限信息
return true;
}
}
SaToken进阶功能介绍
Token黑名单机制
为了防止恶意用户使用过期或被篡改的 Token,SaToken 提供了黑名单机制。当 Token 被添加到黑名单后,即使 Token 未过期,也会被拒绝。
import cn.dev33.satoken.starter.SaTokenManager;
public class BlacklistExample {
public static void main(String[] args) {
// 将 Token 添加到黑名单
SaTokenManager.me().setLoginTokenBlacklist("invalidToken");
// 验证 Token 是否在黑名单中
boolean isInBlacklist = SaTokenManager.me().isLoginTokenBlacklist("invalidToken");
System.out.println("Token 是否在黑名单中: " + isInBlacklist);
}
}
Token的过期策略设置
SaToken 提供了多种过期策略,包括基于时间的过期策略和基于行为的过期策略。可以通过 SaTokenManager
类的 setLoginTokenTimeout
方法来设置 Token 的过期时间。
import cn.dev33.satoken.starter.SaTokenManager;
public class ExpireExample {
public static void main(String[] args) {
// 设置 Token 的过期时间为 10 分钟
SaTokenManager.me().setLoginTokenTimeout(600);
// 获取当前 Token 的剩余过期时间
long remainingTime = SaTokenManager.me().getLoginTokenTimeout();
System.out.println("Token 剩余过期时间为: " + remainingTime + " 秒");
}
}
SaToken常见问题与解决方法
常见问题汇总
- Token 生成后无法使用:检查是否正确设置了 Token 的过期时间。
- Token 刷新失败:确认刷新逻辑是否正确,检查是否在刷新过程中出现了异常。
- Token 黑名单机制无效:检查是否正确调用了
setLoginTokenBlacklist
方法。 - Token 验证失败:检查是否正确设置了 Token 的过期策略,并确保 Token 未被篡改。
解决方案与技巧分享
- Token 生成后无法使用:可以在初始化 Token 时设置合理的过期时间,并在验证 Token 时检查过期时间。
- Token 刷新失败:确保在刷新 Token 时正确更新了用户的 Token,并在代码中处理可能的异常。
- Token 黑名单机制无效:确保在将 Token 添加到黑名单之前,已经正确获取了 Token,并且在验证 Token 时检查了黑名单。
- Token 验证失败:可以使用日志工具记录 Token 验证的详细信息,以便排查问题。
import cn.dev33.satoken.starter.Sa;
import cn.dev33.satoken.starter.SaTokenManager;
public class TokenValidator {
public static void main(String[] args) {
// 验证 Token 是否有效
boolean isValid = Sa.isLogin();
System.out.println("Token 是否有效: " + isValid);
// 获取当前登录的用户 ID
String userId = Sa.getLoginId();
System.out.println("当前登录的用户 ID 为: " + userId);
// 从数据库或缓存中获取用户信息
// User user = userRepository.findById(userId);
// 日志记录
// log.info("User ID: {}, Token Valid: {}", userId, isValid);
}
}
SaToken实战案例
典型应用场景分析
SaToken 可以用于实现各种复杂的业务场景,包括但不限于以下几种:
- 单点登录:用户在一个系统登录后,可以在多个系统间无需再次登录。
- 权限控制:通过 Token 中携带的权限信息,控制用户对资源的访问。
- Token 刷新:在 Token 过期之前,自动刷新 Token,保证用户不会被踢出登录状态。
- Token 黑名单:防止恶意用户使用过期或被篡改的 Token。
实战代码示例详解
以下是一个使用 SaToken 实现的单点登录示例。假设我们有两个系统,系统 A 和系统 B,用户在系统 A 登录后,可以访问系统 B 的资源。
系统 A(登录系统)
import cn.dev33.satoken.starter.SaTokenManager;
public class SystemAController {
public String login(String username, String password) {
// 验证用户名和密码
if (validateUser(username, password)) {
// 生成 Token
String token = SaToken.createToken();
// 保存 Token
SaTokenManager.me().setLoginToken(username, token);
return token;
}
return "登录失败";
}
private boolean validateUser(String username, String password) {
// 模拟用户验证逻辑
return username.equals("admin") && password.equals("123456");
}
}
系统 B(资源访问系统)
import cn.dev33.satoken.starter.Sa;
public class SystemBController {
public String accessResource(String token) {
// 验证 Token 是否有效
if (Sa.isLogin(token)) {
// 获取当前登录的用户 ID
String userId = Sa.getLoginId();
// 返回资源
return "资源访问成功,用户 ID: " + userId;
}
return "访问失败";
}
}
客户端调用示例
public class ClientExample {
public static void main(String[] args) {
// 调用系统 A 的登录接口
String token = callSystemALogin("admin", "123456");
System.out.println("获取到的 Token 为: " + token);
// 调用系统 B 的资源访问接口
String result = callSystemBResource(token);
System.out.println("资源访问结果为: " + result);
}
private static String callSystemALogin(String username, String password) {
// 模拟调用系统 A 的登录接口
// 这里使用假设的逻辑
return "token123";
}
private static String callSystemBResource(String token) {
// 模拟调用系统 B 的资源访问接口
// 这里使用假设的逻辑
return "资源访问成功";
}
}
通过以上示例,可以看到 SaToken 在实现单点登录时的灵活性和高效性。它不仅简化了权限管理的实现,还提高了系统的安全性。