一、Sa-Token介绍

1. Sa-Token简介

Sa-Token是一款轻量级Java权限认证框架,旨在解决Web系统中常见的登录认证、权限验证、Session会话、单点登录等问题。其核心目标是以最简洁的方式,实现强大的权限控制功能,帮助开发者快速完成权限系统的搭建。


Sa-Token具有如下优势:


优势 描述

简单易用 API设计简洁明了,易于集成和使用,上手快,学习成本低。

功能丰富 支持多种权限控制需求,满足复杂业务场景。支持登录认证、权限验证、角色验证、Session会话、多账号体系等功能。

高性能 轻量级设计,对系统性能影响小。

高度可扩展 提供丰富的扩展接口,与Spring、Spring Boot等常用框架高度兼容,支持自定义持久化、注解方式验证、单点登录等高级特性。

社区活跃 有良好的社区支持和文档资源。

2. Sa-Token原理解析

Sa-Token的核心原理是通过Token机制实现用户的身份认证和权限校验。


其主要工作流程如下:


① 登录认证:用户登录成功后,服务器生成一个全局唯一的Token,并将其返回给客户端。

② Token存储:Token与用户身份信息的映射关系保存在服务器的会话中(如Redis、内存等)。

③ 权限验证:客户端请求时携带Token,服务器根据Token获取用户信息,验证其权限是否满足要求。

④ 会话管理:支持Session会话管理,可以获取和操作当前会话的属性。


流程图例如下:



3. Sa-Token与其他权限框架比较

Sa-Token与其他常见权限框架在学习成本、集成难度上有显著优势:


特性 Sa-Token Shiro Spring Security

学习成本 低 中 高

功能丰富度 高 中 高

集成难度 低 中 高

性能表现 高 中 中

社区支持 活跃 一般 活跃

扩展性 高 中 高

二、Sa-Token的基本语法

在实际项目中,Sa-Token通过简单的配置和API调用,即可实现完整的权限管理功能。以下将通过一个完整的Spring Boot示例,演示如何集成和使用Sa-Token。


1. 创建Spring Boot项目

首先,创建一个新的Spring Boot项目,可以使用IDEA的项目向导或Spring Initializr。


引入必要的依赖:


<dependencies>

   <!-- Spring Boot Starter Web -->

   <dependency>

       <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-web</artifactId>

   </dependency>


   <!-- Sa-Token核心依赖 -->

   <dependency>

       <groupId>cn.dev33</groupId>

       <artifactId>sa-token-spring-boot-starter</artifactId>

       <version>1.34.0</version>

   </dependency>

</dependencies>


2. 配置Sa-Token

application.yml


# Sa-Token配置,可根据需要进行调整

sa-token:

 # token有效期,单位秒,默认30天

 timeout: 2592000


 # 是否打开二级登录校验

 open-safe: false


3. 配置拦截器

创建配置类,添加Sa-Token的拦截器,以拦截请求并进行权限验证。


SaTokenConfigure.java


import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.*;


@Configuration

public class SaTokenConfigure implements WebMvcConfigurer {

   @Override

   public void addInterceptors(InterceptorRegistry registry) {

       // 注册Sa-Token的注解拦截器,拦截所有路径

       registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");

   }

}


4. 登录认证

创建登录接口,实现用户登录功能。


LoginController.java


import cn.dev33.satoken.stp.StpUtil;

import org.springframework.web.bind.annotation.*;


@RestController

public class LoginController {


   @PostMapping("/login")

   public String login(@RequestParam String username, @RequestParam String password) {

       // 1. 校验用户名和密码(这里模拟一个简单的校验)

       if("admin".equals(username) && "123456".equals(password)) {

           // 2. 登录,保存用户ID为10001

           StpUtil.login(10001);

           return "登录成功,Token:" + StpUtil.getTokenValue();

       }

       return "用户名或密码错误";

   }

}



说明:


调用StpUtil.login(10001)方法,实现登录操作,参数为用户的唯一标识ID。

登录成功后,可以通过StpUtil.getTokenValue()获取当前会话的Token。

5. 权限验证

创建需要权限验证的接口,例如获取用户信息的接口。


UserController.java


import cn.dev33.satoken.annotation.SaCheckPermission;

import cn.dev33.satoken.stp.StpUtil;

import org.springframework.web.bind.annotation.*;


@RestController

@RequestMapping("/user")

public class UserController {


   // 查询用户信息,需登录

   @GetMapping("/info")

   public String getUserInfo() {

       // 校验是否登录

       StpUtil.checkLogin();

       // 获取用户ID

       int userId = StpUtil.getLoginIdAsInt();

       return "当前用户信息,ID:" + userId;

   }


   // 修改用户信息,需有权限"user:update"

   @SaCheckPermission("user:update")

   @PostMapping("/update")

   public String updateUser() {

       return "用户信息更新成功";

   }

}



说明:


使用StpUtil.checkLogin()方法手动校验登录状态。

使用@SaCheckPermission("user:update")注解,声明该接口需要权限user:update。