手记

SaToken资料详解与入门教程

概述

SaToken是一个基于Java的轻量级权限认证框架,专注于处理Token相关操作,如生成、校验、刷新和过期处理等。它提供了高度灵活的扩展接口,支持多种业务场景,如单点登录和权限控制。本文将详细介绍SaToken的功能、安装方法、基础使用和进阶功能,提供丰富的SaToken资料。

SaToken简介

SaToken是什么

SaToken 是一个基于 Java 语言的轻量级权限认证框架,专门用于处理 Token 相关的操作,如生成、校验、刷新、过期处理等。它提供了高度灵活的扩展接口,使得开发者可以根据需求定制各种业务场景,如单点登录、权限控制、Token 黑名单等。

SaToken的主要功能和优势

  1. 轻量级设计:SaToken 不依赖任何第三方库,体积小巧,易于集成,启动速度更快。
  2. 高度灵活性:支持自定义过期时间、刷新时间、黑名单策略等,能够适应多种业务场景。
  3. 丰富的拓展接口:提供大量的扩展接口,开发者可以轻易实现单点登录、权限控制等复杂功能。
  4. 高性能:SaToken 在每次请求时仅需毫秒级的处理时间,适合高并发场景。
  5. 简单易用:通过简单的 API 调用即可完成 Token 的生成、校验、刷新等操作。
  6. 易于维护:源代码结构清晰,易于理解和维护。
SaToken安装与环境搭建

安装SaToken的准备工作

在安装 SaToken 之前,需要确保满足以下条件:

  • Java 环境已经安装并配置好,建议使用 Java 8 及以上版本。
  • Spring Boot 或 Spring MVC 环境已搭建好。

SaToken安装的步骤详解

  1. 导入依赖:在 Maven 项目中,需要在 pom.xml 文件中添加 SaToken 的依赖。
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>satoken-spring-boot-starter</artifactId>
    <version>1.5.0</version>
</dependency>
  1. 配置 SaToken:在 application.ymlapplication.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
  1. 初始化 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常见问题与解决方法

常见问题汇总

  1. Token 生成后无法使用:检查是否正确设置了 Token 的过期时间。
  2. Token 刷新失败:确认刷新逻辑是否正确,检查是否在刷新过程中出现了异常。
  3. Token 黑名单机制无效:检查是否正确调用了 setLoginTokenBlacklist 方法。
  4. Token 验证失败:检查是否正确设置了 Token 的过期策略,并确保 Token 未被篡改。

解决方案与技巧分享

  1. Token 生成后无法使用:可以在初始化 Token 时设置合理的过期时间,并在验证 Token 时检查过期时间。
  2. Token 刷新失败:确保在刷新 Token 时正确更新了用户的 Token,并在代码中处理可能的异常。
  3. Token 黑名单机制无效:确保在将 Token 添加到黑名单之前,已经正确获取了 Token,并且在验证 Token 时检查了黑名单。
  4. 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 可以用于实现各种复杂的业务场景,包括但不限于以下几种:

  1. 单点登录:用户在一个系统登录后,可以在多个系统间无需再次登录。
  2. 权限控制:通过 Token 中携带的权限信息,控制用户对资源的访问。
  3. Token 刷新:在 Token 过期之前,自动刷新 Token,保证用户不会被踢出登录状态。
  4. 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 在实现单点登录时的灵活性和高效性。它不仅简化了权限管理的实现,还提高了系统的安全性。

0人推荐
随时随地看视频
慕课网APP