什么是 Spring Security 框架
其实没什么复杂的,顾名思义,Spring Security 框架就是 Spring 生态体系中专注于身份认证(Authentication) 和授权(Authorization) 的安全框架。它的核心功能是保护应用程序免受未授权访问,解决 “谁能访问” 以及 “能访问什么” 的问题。
简单来说,它可以实现,或者常见实现于如下场景:
- 用户登录验证(用户名密码、第三方登录等);
- 基于角色 / 权限的访问控制(如 “管理员才能删除数据”);
- 防护常见安全漏洞(如 CSRF、XSS、会话固定攻击等);
- 集成多种认证方式(如 OAuth2.0、JWT、LDAP 等)。
但是他不是一个独立的框架,他是 Spring 生态中的一个 组件? 大概可以这么理解,因为它尤其在 Spring Boot 和 Spring Cloud 中才能发挥重要作用。
与 Spring Boot 的关系可以这么理解
Spring Boot 的核心是 “自动配置”,简化框架集成。Spring Security 与 Spring Boot 结合时:
- 通过
spring-boot-starter-security
依赖,无需手动配置大量 XML 或代码,即可快速启用基础安全功能(如默认登录页、表单认证、密码加密等); - 开发者可通过少量配置(如
application.properties
或 Java 配置类)覆盖默认行为,例如自定义登录页、修改密码加密方式等; - 本质上,Spring Boot 是 “简化集成的工具”,而 Spring Security 是 “提供安全功能的核心框架”,二者结合让安全配置从 “复杂手动” 变为 “开箱即用 + 按需定制”。
与 Spring Cloud 的关系也可以这么理解
Spring Cloud 是微服务架构的解决方案,而微服务的安全面临跨服务认证、统一授权等挑战。Spring Security 在其中的作用是:
- 统一认证授权:通过 Spring Security OAuth2.0 组件,实现微服务间的单点登录(SSO),用户只需登录一次即可访问多个关联服务;
- 网关层安全:结合 Spring Cloud Gateway 或 Zuul,在网关层集中处理认证(如验证 JWT 令牌),避免每个微服务重复实现安全逻辑;
- 服务间通信安全:保护服务间的调用(如通过 OAuth2.0 的客户端模式,实现服务间的授权访问)。
简言之,Spring Cloud 解决微服务架构问题,Spring Security 解决微服务中的安全问题,二者协同保障分布式系统的安全。
Spring Security 框架能做什么
Spring Security是一个Java框架,用于保护应用程序的安全性。它提供了一套全面的安全解决方案,包括身份验证、授权、防止攻击等功能。Spring Security基于过滤器链的概念,可以轻松地集成到任何基于Spring的应用程序中。它支持多种身份验证选项和授权策略,开发人员可以根据需要选择适合的方式。此外,Spring Security还提供了一些附加功能,如集成第三方身份验证提供商和单点登录,以及会话管理和密码编码等。总之,Spring Security是一个强大且易于使用的框架,可以帮助开发人员提高应用程序的安全性和可靠性。
Spring Security是一个框架,提供 认证(authentication)、授权(authorization) 和 保护,以抵御常见的攻击。它对保护命令式和响应式应用程序有一流的支持,是保护基于Spring的应用程序的事实标准。
身份认证(Authentication):验证 “谁在访问系统”
身份认证是确认用户身份的过程,Spring Security 支持多种认证方式,覆盖不同场景:
- 基础用户名密码认证
- 提供默认的表单登录页面(可自定义),支持用户名密码校验。
- 集成
UserDetailsService
从数据库、缓存或第三方系统加载用户信息(如查询用户账号、加密后的密码、角色权限等)。 - 强制密码加密存储(通过
PasswordEncoder
接口,支持 BCrypt、Argon2 等强加密算法,杜绝明文存储风险)。
- 无密码认证扩展
- 支持短信验证码、邮箱链接、人脸识别等非密码登录方式(需自定义
AuthenticationProvider
实现)。 - 集成第三方登录(如微信、QQ、GitHub 等),通过 OAuth2.0/OpenID Connect 协议实现联合认证。
- 支持短信验证码、邮箱链接、人脸识别等非密码登录方式(需自定义
- 令牌认证(适合前后端分离 / 微服务)
- 支持 JWT(JSON Web Token):用户登录后生成包含用户信息的令牌,客户端后续请求携带令牌即可完成认证,无需服务器存储会话(无状态认证)。
- 支持 OAuth2.0 令牌:通过授权服务器颁发的令牌(如 access_token)实现跨服务、跨应用的身份验证。
授权控制(Authorization):控制 “谁能访问什么资源”
授权是在认证通过后,限制用户只能访问其权限范围内的资源,Spring Security 提供多层次的授权能力:
- URL 级别授权
- 基于 URL 路径规则配置访问权限,例如:
- 公开接口(如登录页、首页)允许匿名访问;
- 普通用户接口仅允许
USER
角色访问; - 管理员接口仅允许
ADMIN
角色访问。
- 基于 URL 路径规则配置访问权限,例如:
- 方法级别授权
- 通过注解(如
@PreAuthorize
、@PostAuthorize
)在方法上直接定义权限规则,细粒度控制业务逻辑的访问权限。
- 通过注解(如
- 动态权限与数据权限
- 支持从数据库动态加载权限规则(而非硬编码),适合权限频繁变更的系统(如后台管理系统)。
- 结合业务逻辑实现数据级权限控制,例如:用户只能查看自己创建的订单、部门经理只能管理本部门员工等。
安全防护:抵御常见攻击
Spring Security 内置了对多种常见安全威胁的防护机制,无需手动实现:
- CSRF(跨站请求伪造)防护
- 默认启用 CSRF 令牌验证,防止恶意网站利用用户已登录的会话发起非预期请求(如转账、删帖)。
- 前后端分离场景可按需关闭(需确保使用 Token 认证且前端无法获取 Cookie)。
- XSS(跨站脚本攻击)防护
- 自动添加安全响应头(如
X-XSS-Protection
),并支持通过配置增强对输入输出的过滤。
- 自动添加安全响应头(如
- 会话管理安全
- 防止会话固定攻击:登录时自动更换会话 ID。
- 控制并发登录:限制同一用户同时登录的设备数量(如只允许一台设备在线)。
- 会话过期管理:配置会话超时时间,自动失效并跳转至登录页。
- CORS(跨域资源共享)控制
- 允许配置信任的域名、请求方法和 headers,防止未授权的跨域访问。
- 其他防护
- 防止暴力破解:可集成验证码、登录失败次数限制(如 5 次失败后锁定账号)。
- 敏感数据保护:通过密码加密、传输层 TLS 支持(HTTPS)确保数据安全。
集成与扩展:适配复杂架构
Spring Security 并非孤立存在,而是能与 Spring 生态及主流技术无缝集成:
- 与 Spring Boot 集成
- 通过
spring-boot-starter-security
依赖实现 “开箱即用”,自动配置基础安全功能(如默认登录页、密码加密等),开发者只需少量配置即可定制需求。
- 通过
- 与 Spring Cloud 集成(微服务场景)
- 实现统一认证授权:通过 OAuth2.0 授权服务器集中颁发令牌,资源服务器验证令牌,解决微服务间的身份信任问题。
- 网关层安全:结合 Spring Cloud Gateway 在网关集中处理认证(如验证 JWT),避免每个服务重复实现安全逻辑。
- 单点登录(SSO):用户一次登录即可访问多个关联服务(如企业内部的 OA、CRM 系统)。
- 与其他技术栈集成
- 支持与 Redis、MySQL 等存储系统集成,实现令牌持久化、用户信息缓存。
- 兼容前端框架(Vue、React 等):通过返回 JSON 格式的认证结果,适配前后端分离架构。
和其他安全框架的关系
我们都知道 OAuth2.0、JWT 等这些安全领域的技术,那么 Spring Security 和他们是什么关系,在其中又是怎么使用怎么体现的呢?
首先,OAuth2.0 和 JWT 并非 Spring Security 的一部分,但它们是 Spring Security 常用的 “扩展工具”,用于解决特定场景的安全问题。
OAuth2.0 是一个授权框架(而非认证框架),定义了 “第三方应用如何获取用户资源授权” 的流程(如微信登录、GitHub 授权登录)。
Spring Security 与 OAuth2.0 的关系:
- Spring Security 提供了
spring-security-oauth2
模块,原生支持 OAuth2.0 协议,可快速实现授权服务器(颁发令牌)和资源服务器(验证令牌); - 例如:用 Spring Security 搭建的授权服务器,可按照 OAuth2.0 的 “授权码模式”,向第三方应用颁发访问令牌,实现用户无需暴露密码即可授权第三方访问资源。
JWT(JSON Web Token)是一种令牌格式,用于在客户端和服务器间传递 “可验证的声明”(如用户 ID、角色、过期时间等)。
而 Spring Security 与 JWT 的关系:
- JWT 本身不是安全框架,而是一种 “无状态令牌” 的实现方式;
- Spring Security 可集成 JWT 作为认证载体:用户登录后,服务器生成 JWT 令牌返回给客户端,后续请求客户端携带 JWT,服务器通过验证 JWT 即可完成认证(无需存储会话,适合分布式系统);
- 通常与 OAuth2.0 配合使用:OAuth2.0 定义令牌的颁发流程,JWT 作为令牌的具体格式(替代传统的 “随机字符串令牌”)。
Spring Security 是 Spring 生态中处理安全问题的核心框架,与 Spring Boot 结合实现快速集成,与 Spring Cloud 协同保障微服务安全。它本身不依赖 OAuth2.0 和 JWT,但通过集成这些工具可扩展至复杂场景(如第三方授权、分布式认证)
Spring Security 框架都要学习什么内容
首先这个框架是要学完 Spring Boot
再来的,因为其中的自动配置原理(@EnableAutoConfiguration
)、Starter
机制、条件注解(@Conditional
),因为 Spring Security 与
Spring Boot 深度集成,很多默认行为由自动配置类(如
SecurityAutoConfiguration
)实现,不会会吃力。
核心概念与基础组件
核心安全流程
认证(Authentication):验证 “用户是谁” 的过程,核心流程:
- 客户端提交凭证(用户名密码 / Token)→
AuthenticationManager
验证 → 生成Authentication
对象(包含用户信息、权限)→ 存入SecurityContext
(线程局部变量,方便后续访问)。
授权(Authorization):验证 “用户能做什么” 的过程,核心逻辑:
- 基于
SecurityContext
中的用户权限 → 比对访问资源所需权限 → 允许 / 拒绝访问。
核心组件(源码级理解)
SecurityContextHolder
:存储当前线程的安全上下文(SecurityContext
),是获取用户信息的入口(如SecurityContextHolder.getContext().getAuthentication()
)。Authentication
:封装认证信息的接口,包含:principal
:用户主体(如用户名、UserDetails
对象);credentials
:凭证(如密码,认证后通常会被清空);authorities
:用户拥有的权限(GrantedAuthority
集合,如ROLE_ADMIN
)。
AuthenticationManager
:认证核心接口,默认实现为ProviderManager
,通过管理多个AuthenticationProvider
实现不同类型的认证(如用户名密码认证、JWT 认证)。UserDetailsService
:加载用户信息的接口(核心方法loadUserByUsername
),需自定义实现(如从数据库查询用户),返回UserDetails
对象(包含用户名、密码、权限等)。PasswordEncoder
:密码加密接口,必须使用(禁止明文存储),主流实现:BCryptPasswordEncoder
(默认推荐,自适应加密,随硬件升级增强);Argon2PasswordEncoder
(更安全,支持内存 / 时间成本调整);Pbkdf2PasswordEncoder
(基于 PBKDF2 算法)。
SecurityFilterChain
:安全过滤器链,定义了请求处理的一系列过滤器(如认证过滤器、授权过滤器、CSRF 过滤器),是 6.x 版本配置安全规则的核心 Bean。
授权控制,细粒度权限管理
安全防护与会话管理
常见安全威胁防护
- CSRF 防护:6.x 中默认启用,通过
csrf(csrf -> csrf.disable())
关闭(仅建议在纯 API 场景,且前端无法存储 CSRF Token 时使用)。 - CORS 配置:解决跨域问题,允许指定域名访问接口:
- 安全 Headers:自动添加
X-Content-Type-Options
、X-Frame-Options
等 headers 防护 XSS、点击劫持,可通过headers()
自定义。
会话管理:
- 会话创建策略:配置会话何时创建(如
sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
适合 Token 认证的无状态场景)。 - 并发登录控制:限制同一用户同时登录的设备数:
- 会话固定攻击防护:登录时更换会话 ID(默认启用,通过
sessionFixation().newSession()
配置)。
高级特性:OAuth2.0 与 JWT(分布式场景)
1. OAuth2.0 与 OpenID Connect(OIDC)
OAuth2.0 是授权框架(解决 “第三方应用如何安全获取用户资源授权”),OIDC 是基于 OAuth2.0 的认证层(提供用户身份信息),是微服务、第三方登录的核心方案。
- 核心角色
- 资源所有者(用户)、客户端(第三方应用)、授权服务器(颁发令牌)、资源服务器(验证令牌并提供资源)。
- 授权流程:重点掌握授权码模式(最安全,用于前后端分离、第三方登录)和客户端模式(服务间调用)。
- Spring Security 集成
- 授权服务器:使用
spring-security-oauth2-authorization-server
模块,配置客户端信息、令牌存储(JWT 或数据库)。 - 资源服务器:通过
@EnableResourceServer
或 6.x 中的oauth2ResourceServer()
配置,验证令牌合法性。
- 授权服务器:使用
2. JWT(JSON Web Token)
JWT 是一种紧凑的令牌格式,用于在客户端和服务器间传递可验证的声明(如用户 ID、权限、过期时间),适合无状态认证(无需存储会话)。
- JWT 结构:头部(算法)+ 载荷(声明)+
签名(防篡改),格式为
xxxxx.yyyyy.zzzzz
。 - Spring Security 集成 JWT
- 登录成功后生成 JWT 并返回(自定义
AuthenticationSuccessHandler
)。 - 自定义
JwtAuthenticationFilter
:拦截请求,提取 JWT 并验证,生成Authentication
对象存入SecurityContext
。 - 配置无状态会话(
SessionCreationPolicy.STATELESS
),关闭 CSRF。
- 登录成功后生成 JWT 并返回(自定义
- 注意事项:JWT 不可修改(一旦生成无法撤销),需合理设置过期时间 + 刷新令牌机制;敏感信息不应存入载荷(Base64 编码可解码)。
与微服务集成
Spring Cloud 集成
- 网关层统一认证:在 Spring Cloud Gateway 中集成 Spring Security,集中验证 JWT/OAuth2 令牌,避免每个微服务重复实现认证逻辑。
- 服务间调用安全:通过 OAuth2 客户端模式,服务间调用时携带客户端凭证获取令牌,确保服务身份可信。
- 服务网格(Service Mesh)协同:与 Istio 等服务网格配合,在代理层处理 TLS 加密、身份验证,Spring Security 负责应用层授权。
单点登录(SSO)
基于 OAuth2.0/OIDC 实现 SSO:用户在一个系统登录后,无需重复登录即可访问其他关联系统(如企业内部多个应用共用一套账号体系)。
2FA
在密码基础上增加第二重验证(如短信验证码、Google 身份验证器),通过
Spring Security 的 AuthenticationProvider
扩展实现。
神秘内容
Spring Security 6.x 相比 5.x 有重大调整,直接影响代码写法:
- 移除
WebSecurityConfigurerAdapter
:不再通过继承该类配置安全规则,改为通过组件式配置(定义SecurityFilterChain
、UserDetailsService
等 Bean)。 - 强化函数式风格配置:支持通过 Lambda
表达式定义安全规则(如
authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
)。 - OAuth2 模块重构:原
spring-security-oauth2
被拆分,授权服务器功能由独立的spring-security-oauth2-authorization-server
模块实现(更符合 OAuth2.1 规范)。 - 默认安全增强:默认启用 CSRF 防护、更严格的 CORS 策略、密码加密算法升级(推荐 Argon2、BCrypt 等)。