SaToken是一个基于Java的轻量级权限认证框架,专注于处理Token相关操作,如生成、校验、刷新和过期处理等。它提供了高度灵活的扩展接口,支持多种业务场景,如单点登录和权限控制。本文将详细介绍SaToken的功能、安装方法、基础使用和进阶功能,提供丰富的SaToken资料。
SaToken简介SaToken 是一个基于 Java 语言的轻量级权限认证框架,专门用于处理 Token 相关的操作,如生成、校验、刷新、过期处理等。它提供了高度灵活的扩展接口,使得开发者可以根据需求定制各种业务场景,如单点登录、权限控制、Token 黑名单等。
在安装 SaToken 之前,需要确保满足以下条件:
pom.xml
文件中添加 SaToken 的依赖。<dependency> <groupId>cn.dev33</groupId> <artifactId>satoken-spring-boot-starter</artifactId> <version>1.5.0</version> </dependency>
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
@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基础使用教程
在 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 是否有效。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,从而延长用户登录状态的持续时间。可以通过 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,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); } }
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常见问题与解决方法
setLoginTokenBlacklist
方法。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 可以用于实现各种复杂的业务场景,包括但不限于以下几种:
以下是一个使用 SaToken 实现的单点登录示例。假设我们有两个系统,系统 A 和系统 B,用户在系统 A 登录后,可以访问系统 B 的资源。
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"); } }
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 在实现单点登录时的灵活性和高效性。它不仅简化了权限管理的实现,还提高了系统的安全性。