在前后端分离、微服务架构成为主流的今天,系统的认证与授权是保障接口安全的核心环节。SpringSecurity 作为 Spring 生态原生的安全框架,凭借其 “开箱即用、高度可扩展” 的特性,成为 Java 后端开发者实现系统安全的首选工具。
本文面向SpringSecurity 零基础 / 入门级开发者,从基础概念到实战落地,全程拆解 SpringSecurity 核心功能(认证、授权、RememberMe、JWT 等),所有代码均基于securitdemo项目(文末附完整工具类代码),步骤细化到 “复制即可运行”,同时补充实战中常见的坑点与解决方案,帮你一站式掌握 SpringSecurity 核心用法。
认证授权概述
认证授权概念
很多人容易混淆 “认证” 和 “授权”,用通俗的话解释:
两者的执行顺序:先认证,后授权;认证失败直接拒绝访问,认证成功才会进入授权校验环节。
RBAC权限模型
RBAC(Role-Based Access Control,基于角色的访问控制)是企业级项目中最常用的权限模型,核心是 “用户 - 角色 - 权限” 的三层关联:
| 核心实体 |
作用 |
示例 |
| 用户(User) |
系统的操作者 |
张三、李四 |
| 角色(Role) |
一组权限的集合 |
管理员、普通用户、运营 |
| 权限(Permission) |
操作资源的最小单元 |
新增用户、删除订单、查看报表 |
关联逻辑: 给用户分配角色,给角色分配权限,用户通过角色间接拥有权限。
优势: 权限管理解耦(比如 “管理员” 角色的权限变更时,所有分配该角色的用户自动生效),适配企业级复杂权限场景。
常见认证方式
| 认证方式 |
适用场景 |
优缺点 |
| 用户名 + 密码 |
后台管理系统、内部系统 |
简单易实现;安全性依赖密码复杂度 |
| 短信 / 邮箱验证码 |
移动端 APP、用户登录 |
无需记忆密码;依赖短信 / 邮箱服务 |
| OAuth2.0(第三方登录) |
面向 C 端的系统(如电商、社交) |
提升用户体验;需对接第三方平台 |
| JWT 令牌 |
前后端分离、微服务 |
无状态、跨域;需处理令牌过期 / 注销 |
| Session 认证 |
传统单体应用 |
简单;分布式场景下需共享 Session |
SpringSecurity简介
安全框架核心特性
SpringSecurity 不是一个 “单一功能组件”,而是一套完整的安全解决方案,核心特性包括:
- 认证机制: 支持表单登录、HTTP Basic 认证、OAuth2.0、LDAP 等多种认证方式;
- 授权控制: 支持 URL 级、方法级、注解级的精细化权限控制;
- 安全防护: 内置 CSRF、XSS、会话固定攻击、点击劫持等防御机制;
- 无缝集成: 与 SpringBoot、SpringCloud 深度融合,配置极简;
- 高度可扩展: 核心接口(如 UserDetailsService)支持自定义实现,适配各类业务场景。
常用安全框架
| 特性 |
SpringSecurity |
Shiro |
| 生态融合 |
与 Spring 全家桶无缝集成 |
独立框架,适配所有 Java 项目 |
| 功能丰富度 |
功能全面(认证、授权、防护、OAuth2 等) |
核心功能(认证、授权),轻量 |
| 学习成本 |
稍高(配置多、概念多) |
低(API 简单、文档友好) |
| 适用场景 |
中大型 Spring 体系项目、微服务 |
小型项目、非 Spring 体系项目 |
SpringSecurity 核心原理
SpringSecurity 的核心是过滤器链(Filter Chain):客户端请求进入后端后,会依次经过多个安全过滤器,每个过滤器负责一个安全功能(比如认证过滤器、授权过滤器、CSRF 过滤器)。
- 若某一个过滤器校验失败(比如认证过滤器发现用户名密码错误),直接返回错误响应;
- 所有过滤器校验通过,才会到达 Controller 层处理业务。
快速入门
创建SpringBoot项目
创建名为SpringSecurityDemo的SpringBoot项目,填写项目的信息后点击下一步:

这里我们随便选择一个版本号因为后期要更改版本号,也不需要选择模块,好了之后点击创建:

创建完成后我们修改pom文件中SpringBoot的版本为3.3.5:

导入依赖:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| <properties> <java.version>17</java.version> <jjwt.version>0.9.1</jjwt.version> <java-jwt.version>4.3.0</java-jwt.version> <fastjson.version>2.0.24</fastjson.version> <hutool.version>5.8.11</hutool.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.5</version> </dependency> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> </dependency>
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>${jjwt.version}</version> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>${java-jwt.version}</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>${hutool.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency>
<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> </dependencies>
|