导读:本期聚焦于重启一下创作的《Spring Boot 如何整合 Sa-Token 实现轻量级权限认证与单点登录?》,敬请观看详情。后台管理系统通常由多个独立服务组成,如果每个服务单独实现登录和权限校验,维护成本很高,单点登录成为刚需。Spring Boot 整合 Sa-Token 可以同时解决认证、鉴权与单点登录问题,而且不需要引入 Spring Security 那样重的配置。Sa-Token 的核心是 StpUtil 静态工具类,通过拦截器或 AOP 注入上下文,支持注解鉴权、路由拦截、Session 会话、踢人下线、权限角色模型等。单点登录模式下,认证中心签发 ticket 并回跳子系统,子系统通过 ticket 校验登录态,实现一次登录多端通行。本文结合依赖引入、配置类编写、登录接口实现、权限注解用法以及 SSO 模式配置,给出完整的整合步骤,并说明常见配置参数和注意事项,帮助开发者快速落地轻量级认证方案。

Sa-Token 是一个轻量级 Java 权限认证框架,其核心设计围绕登录认证、权限校验、Session 会话和单点登录展开,对 Spring Boot 的集成非常友好。与 Spring Security 相比,Sa-Token 的配置更少,API 更贴近业务语义,通过 StpUtil 工具类即可完成大部分操作。框架内部采用策略模式管理不同的认证实现,默认基于内存存储会话,同时支持 Redis 等持久化扩展,在保持轻量的同时具备生产环境所需的能力。

Spring Boot 如何整合 Sa-Token 实现轻量级权限认证与单点登录?

对于需要快速搭建权限体系的 Spring Boot 项目,Sa-Token 可以显著降低学习成本和集成成本。接下来将从核心机制、基础配置、注解鉴权和单点登录四个部分展开,帮助开发者掌握完整的整合思路。

一、Sa-Token 核心机制与轻量级设计

Sa-Token 将登录状态抽象为 LoginId,通常对应业务系统中的用户主键。调用 StpUtil.login(1001) 后,框架会在当前请求上下文中写入登录态,并根据配置生成一个 token 返回给客户端。后续请求只需要携带该 token,框架就能通过拦截器或过滤器自动解析并恢复登录上下文。整个过程无需手动维护 Session,也不依赖传统的 HttpSession 机制,因此可以轻松扩展到无状态服务或微服务网关场景。

权限控制方面,Sa-Token 提供了基于角色的模型和基于权限码的模型。角色模型适合粗粒度控制,例如判断用户是否具备 admin 角色;权限码模型则更精细,例如 order:add 表示新增订单的权限。框架支持在配置类中集中定义拦截规则,也支持在控制器方法上使用注解。两种方式可以结合使用,拦截器负责全局登录校验,注解负责细粒度权限校验,职责清晰且直观。

Sa-Token 的轻量体现在两个方面:一是核心包体积小,没有引入过多传递依赖;二是 API 设计非常直白,StpUtil.login、StpUtil.logout、StpUtil.checkLogin、StpUtil.checkPermission 等方法名称与业务含义一一对应。对于中小型项目而言,这意味着不需要编写大量样板代码,也不需要理解复杂的过滤器链和认证管理器,就能获得完整的认证与授权能力。

二、Spring Boot 整合 Sa-Token 的基础配置

整合的第一步是在 Maven 或 Gradle 项目中引入 Sa-Token 的 Spring Boot Starter。该 Starter 会自动装配核心组件,包括上下文处理器、拦截器注册入口和配置属性绑定。引入依赖后,只需要在 application.yml 中添加少量配置并编写一个配置类,即可完成基础集成。

以下依赖以 Maven 为例,版本可以根据实际情况选择稳定版本。建议使用与 Spring Boot 版本兼容的最新版,避免出现 API 不匹配的问题。

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.34.0</version>
</dependency>

在 application.yml 中通常需要配置 token 名称、有效期、是否允许并发登录以及 token 生成风格。这些参数会直接影响客户端携带凭证的方式和会话失效策略。例如 token-name 设置为 satoken 时,客户端需要通过 satoken 请求头或参数传递凭证。timeout 单位为秒,设置 -1 表示永不过期,适合需要长期登录的桌面端应用。

sa-token:
  token-name: satoken
  timeout: 2592000
  active-timeout: -1
  is-concurrent: true
  is-share: true
  token-style: uuid
  is-log: false

接下来需要注册一个全局拦截器,让 Sa-Token 能够拦截请求并执行登录校验。在 Spring Boot 中实现 WebMvcConfigurer 接口并添加拦截器即可。下面的配置类对除登录、登出和 SSO 相关路径外的所有请求执行 StpUtil.checkLogin(),未登录时框架会抛出 NotLoginException,可以通过全局异常处理器转换为统一的 JSON 响应。

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
                .addPathPatterns("/**")
                .excludePathPatterns("/user/login", "/user/logout", "/sso/*");
    }
}

SaInterceptor 的构造参数是一个 SaParamFunction 接口,这里使用 Lambda 表达式传入登录校验逻辑。如果不需要全局登录校验,也可以只注册拦截器而不执行任何逻辑,然后完全依赖注解进行权限控制。这种灵活的拦截方式允许开发者根据项目的实际安全边界来定制拦截范围,避免过度校验导致的接口访问异常。

三、基于注解的权限认证实践

Sa-Token 提供了一组开箱即用的注解,包括 @SaCheckLogin、@SaCheckPermission、@SaCheckRole 和 @SaCheckSafe。这些注解可以标注在控制器类或方法上,框架通过 AOP 在方法执行前完成校验。注解方式适合细粒度权限控制,与全局拦截器形成互补。例如全局拦截器只校验登录态,而具体接口再通过 @SaCheckPermission 校验是否拥有某个权限码。

下面先实现一个简单的登录接口,用户提交用户名和密码后,如果账号密码正确,就调用 StpUtil.login 写入登录态。登录成功后,客户端会收到一个 token,后续访问受保护接口时携带该 token 即可完成认证。实际项目中密码必须加密存储,这里为了演示直接使用明文比较。

@RestController
public class UserController {
    @PostMapping("/user/login")
    public SaResult login(String username, String password) {
        if ("admin".equals(username) && "123456".equals(password)) {
            StpUtil.login(1001);
            return SaResult.ok("登录成功");
        }
        return SaResult.error("账号或密码错误");
    }

    @GetMapping("/user/info")
    public SaResult info() {
        Object loginId = StpUtil.getLoginId();
        return SaResult.data(loginId);
    }
}

在业务控制器中,可以直接给方法添加权限注解。下面的订单控制器中,list 接口只需要登录即可访问,add 接口需要 order:add 权限,delete 接口则需要 admin 角色。当权限校验失败时,框架会抛出 NotPermissionException 或 NotRoleException,同样可以通过全局异常处理器返回友好的错误提示。

@RestController
@RequestMapping("/order")
public class OrderController {

    @SaCheckLogin
    @GetMapping("/list")
    public SaResult list() {
        return SaResult.ok("订单列表");
    }

    @SaCheckPermission("order:add")
    @PostMapping("/add")
    public SaResult add() {
        return SaResult.ok("新增订单");
    }

    @SaCheckRole("admin")
    @DeleteMapping("/delete")
    public SaResult delete() {
        return SaResult.ok("删除订单");
    }
}

注解校验的底层实现基于 SaStrategy 策略与 AOP 切面,性能开销很小,不会对接口响应时间产生明显影响。需要注意的是,注解中传入的权限码或角色名必须与业务系统定义一致,否则会导致校验不通过。如果权限体系较为复杂,建议在项目中统一维护权限码常量,避免出现拼写错误和重复定义。

除了注解,Sa-Token 还支持在配置类中定义路由拦截规则,通过 SaRouteFunction 接口返回一组 SaRouteItem 对象,每个对象包含路由匹配表达式和所需权限。这种方式适合需要在网关层或统一入口做集中式鉴权的场景,可以避免在大量控制器方法上重复添加注解。但它的可读性略低于注解方式,通常需要结合项目团队的习惯来选择。

四、单点登录模式配置与跨域登录流程

Sa-Token 提供了 SSO 模块,可以将一个服务作为认证中心,其他子系统作为客户端接入。认证中心的职责是处理登录表单、校验账号密码、签发 ticket 并重定向回客户端;客户端的职责是接收 ticket,然后向认证中心发起校验请求,获取用户信息并建立本地会话。整个流程基于 ticket 一次性凭证,安全性高于直接传递 token,适合多系统统一登录的场景。

在认证中心服务中,需要引入 sa-token-sso 模块并注册服务端处理器。服务端处理器负责暴露 SSO 相关的接口,例如登录页、ticket 签发和校验接口。下面是一个简单的服务端配置类,通过 @Bean 创建 SaSsoServerProcessor 即可启用服务端能力。

@Configuration
public class SaSsoServerConfig {
    @Bean
    public SaSsoServerProcessor saSsoServerProcessor() {
        return new SaSsoServerProcessor();
    }
}

客户端服务则需要注册客户端处理器,并配置认证中心地址、客户端回调地址以及 ticket 校验方式。客户端处理器会自动处理回调请求和本地会话创建。通常客户端还需要配置一个拦截器,对未登录请求跳转到认证中心的登录页,并携带 redirect 参数指定登录成功后的回跳地址。这样可以实现一次登录,多个客户端子系统共享登录状态。

@Configuration
public class SaSsoClientConfig {
    @Bean
    public SaSsoClientProcessor saSsoClientProcessor() {
        return new SaSsoClientProcessor();
    }
}

在 application.yml 中,认证中心和客户端分别需要配置 sso 相关的参数。认证中心需要设置 ticket 有效期和是否允许 http 传输;客户端需要设置认证中心域名、自身回调地址和 sso 接口前缀。由于单点登录涉及跨域跳转,正式环境中务必使用 https 并配置好 Cookie 的 SameSite 属性,避免浏览器限制导致 session 无法共享。Sa-Token 内部对跨域处理提供了基础支持,但复杂场景下仍建议通过网关统一处理 CORS 和域名映射。

单点登录的登录流程通常如下:用户访问客户端受保护页面,客户端拦截器发现未登录,重定向到认证中心的登录页并带上 redirect 地址;用户在认证中心完成登录后,认证中心生成 ticket 并重定向回客户端的回调地址;客户端回调处理器收到 ticket,调用认证中心校验接口,校验成功后创建本地会话并重定向到最初访问的页面。整个过程中 ticket 只能使用一次,有效期为几分钟,极大降低了凭证泄露的风险。

Sa-Token 的 SSO 模式还支持多种扩展,例如跨域单点登录、与第三方 OAuth2 协议对接、以及多端登录互踢。对于需要集成现有用户体系的团队,可以通过自定义 SaSsoServerTemplate 来扩展认证中心的账号校验逻辑,而无需修改框架核心代码。这种设计让 Sa-Token 在保持轻量的同时,能够适应大多数企业级单点登录需求。

综上所述,Sa-Token 在 Spring Boot 项目中的整合成本低,权限模型清晰,SSO 能力完整。相比传统的 Spring Security 配置,它更适合中小型项目或希望快速落地的开发场景。只要掌握 StpUtil 工具类、拦截器配置、注解鉴权和 SSO 模块四个关键部分,就可以构建出安全可靠的认证与权限体系。

Spring BootSa-Token权限认证修改时间:2026-10-03 15:02:04

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/1003/65148.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。