锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Spring Boot 整合 SA-Token 的使用详解

Spring Boot 整合 SA-Token 的使用详解

0
  • JAVA
  • 发布于 2024-08-14
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

Spring Boot 整合 SA-Token 的使用详解涉及多个方面,包括 SA-Token 的介绍、整合步骤、配置方法、具体使用场景以及代码示例等。以下是一个详细的解析,旨在帮助读者全面理解和应用 SA-Token 在 Spring Boot 项目中的权限认证和登录认证功能。

一、SA-Token 介绍

SA-Token 是一个轻量级的 Java 权限认证框架,由国人开发,主要解决登录认证、权限认证、单点登录、OAuth2.0、分布式 Session 会话、微服务网关鉴权等一系列权限相关问题。SA-Token 旨在以简单、优雅的方式完成系统的权限认证部分,其特点包括:

  • 轻量级:SA-Token 不依赖任何第三方框架,只依赖 JDK 原生 API,易于学习和使用。
  • 零配置:SA-Token 提供了丰富的内置功能,用户可以通过简单的配置即可使用,无需编写大量的代码。
  • 注解式鉴权:SA-Token 提供了丰富的注解,如@SaCheckPermission、@SaCheckRole等,可以很方便地在 Controller 层进行权限控制。
  • 丰富的会话管理:SA-Token 支持多种会话管理方式,包括 Account-Session、Token-Session、Custom-Session 等,并提供了丰富的会话操作方法。

二、Spring Boot 整合 SA-Token 的步骤

1. 引入 SA-Token 依赖

首先,你需要在 Spring Boot 项目的pom.xml文件中引入 SA-Token 的依赖。如果你使用的是 Spring Boot 3.x 版本,需要引入sa-token-spring-boot3-starter依赖;如果是 Spring Boot 2.x 版本,则引入sa-token-spring-boot-starter依赖。以 Spring Boot 3.x 为例,添加依赖如下:

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot3-starter</artifactId>
    <version>最新版本</version> <!-- 请替换为最新版本号 -->
</dependency>
2. 配置 SA-Token

在application.yml或application.properties配置文件中,你可以根据需要配置 SA-Token 的相关参数。以下是一个配置示例:

sa-token:
  token-name: Authorization  # token名称 (header中key)
  token-type: bearer         # token类型 (header中value的前缀)
  timeout: 3600              # token过期时间, 单位秒
  activity-timeout: -1       # 临时token有效时间, 单位秒,-1表示永不过期
  is-concurrent: true        # 是否允许同一账号并发登录, 默认false
  is-share: false            # 在多个服务之间共享token时,需要设置为true
3. 编写登录和注销逻辑

SA-Token 提供了简单的 API 来处理登录和注销逻辑。你可以在你的 Controller 中编写登录接口,使用StpUtil.login(Object id)方法来实现登录,使用StpUtil.logout()方法来实现注销。以下是一个登录接口的示例:

@RestController
@RequestMapping("/user")
public class UserController {

    @PostMapping("/login")
    public SaResult login(@RequestBody UserDTO userDTO) {
        // 假设UserDTO中包含了用户名和密码
        // 这里只是示例,实际项目中应该从数据库中查询用户信息并进行比对
        if ("zhangsan".equals(userDTO.getUsername()) && "123456".equals(userDTO.getPassword())) {
            // 登录成功,id为用户的唯一标识,这里假设为1
            StpUtil.login(1);
            return SaResult.ok("登录成功");
        }
        return SaResult.error("登录失败");
    }

    @GetMapping("/logout")
    public SaResult logout() {
        // 注销当前会话
        StpUtil.logout();
        return SaResult.ok("注销成功");
    }
}

三、SA-Token 的具体使用场景

1. 权限认证

SA-Token 提供了丰富的权限认证功能,包括权限码认证、角色认证等。你可以通过实现StpInterface接口来自定义权限和角色的加载逻辑,然后在 Controller 层使用@SaCheckPermission和@SaCheckRole注解来进行权限控制。

2. 会话管理

SA-Token 支持多种会话管理方式,包括 Account-Session、Token-Session、Custom-Session 等。你可以通过StpUtil类提供的方法来获取当前会话的 Token 值、登录 ID 等信息,也可以对会话进行操作,如踢出用户、延长会话有效期等。

3. 分布式 Session 管理

在分布式系统中,Session 共享是一个常见问题。SA-Token 通过其内置的分布式 Session 支持,可以轻松实现 Session 的跨服务共享。SA-Token 支持 Redis、JWT 等多种方式来存储和同步 Session 信息,用户可以根据实际需求选择合适的方案。

四、代码示例:使用 SA-Token 进行权限控制

在 Spring Boot 项目中,你可以很方便地利用 SA-Token 的注解功能进行权限控制。以下是一个使用@SaCheckPermission注解进行权限码校验的示例:

@RestController
@RequestMapping("/admin")
public class AdminController {

    @GetMapping("/data")
    @SaCheckPermission("admin:data:view") // 需要拥有admin:data:view权限码的用户才能访问
    public SaResult getData() {
        // 假设这里是获取敏感数据的逻辑
        return SaResult.ok().setData("敏感数据");
    }

    @PostMapping("/modify")
    @SaCheckPermission("admin:data:modify") // 需要拥有admin:data:modify权限码的用户才能访问
    public SaResult modifyData(@RequestBody DataDTO dataDTO) {
        // 假设这里是修改数据的逻辑
        return SaResult.ok("数据修改成功");
    }
}

在这个例子中,getData方法和modifyData方法分别通过@SaCheckPermission注解指定了访问这两个接口所需的权限码。当用户访问这些接口时,SA-Token 会自动检查当前会话是否拥有相应的权限码,如果没有,则会抛出权限不足的异常。

五、配置和使用 JWT

SA-Token 也支持 JWT(Json Web Token)作为 Token 的存储方式。如果你想要使用 JWT 来实现无状态的 Token 认证,可以在配置文件中进行相应的设置,并在登录时生成 JWT Token。

首先,在配置文件中启用 JWT 模式,并设置 JWT 的密钥等信息:

sa-token:
  token-style: jwt # 使用jwt方式
  jwt-secret-key: your-secret-key # jwt密钥
  jwt-public-key:  # jwt公钥(非必须,如果使用RSA非对称加密时才需要)
  jwt-algorithm: HS256 # jwt加密算法

然后,在登录时生成 JWT Token 并返回给客户端:

@PostMapping("/login")
public ResponseEntity<String> login(@RequestBody UserDTO userDTO) {
    // 假设验证用户信息成功后
    String jwtToken = StpUtil.createToken(userDTO.getId(), "自定义数据", 3600*24); // 生成jwt token,有效期为24小时
    HttpHeaders headers = new HttpHeaders();
    headers.add("Authorization", "Bearer " + jwtToken); // 将token放入Header中返回
    return new ResponseEntity<>("登录成功", HttpStatus.OK, headers);
}

客户端在后续请求中,需要将 JWT Token 放在请求的 Header 中(如Authorization: Bearer 你的JWTToken),SA-Token 会自动从 Header 中解析 JWT Token,并进行相应的认证和授权操作。

六、总结

SA-Token 作为一个轻量级的 Java 权限认证框架,以其简单易用、功能丰富等特点,在 Spring Boot 项目中得到了广泛的应用。通过整合 SA-Token,你可以很方便地实现登录认证、权限认证、会话管理等一系列权限相关功能。希望本文的详细解析能够帮助你更好地理解和使用 SA-Token。

标签: #软件开发 1171 #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.