什么是 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 支持多种认证方式,覆盖不同场景:

  1. 基础用户名密码认证
    • 提供默认的表单登录页面(可自定义),支持用户名密码校验。
    • 集成 UserDetailsService 从数据库、缓存或第三方系统加载用户信息(如查询用户账号、加密后的密码、角色权限等)。
    • 强制密码加密存储(通过 PasswordEncoder 接口,支持 BCrypt、Argon2 等强加密算法,杜绝明文存储风险)。
  2. 无密码认证扩展
    • 支持短信验证码、邮箱链接、人脸识别等非密码登录方式(需自定义 AuthenticationProvider 实现)。
    • 集成第三方登录(如微信、QQ、GitHub 等),通过 OAuth2.0/OpenID Connect 协议实现联合认证。
  3. 令牌认证(适合前后端分离 / 微服务)
    • 支持 JWT(JSON Web Token):用户登录后生成包含用户信息的令牌,客户端后续请求携带令牌即可完成认证,无需服务器存储会话(无状态认证)。
    • 支持 OAuth2.0 令牌:通过授权服务器颁发的令牌(如 access_token)实现跨服务、跨应用的身份验证。

授权控制(Authorization):控制 “谁能访问什么资源”

授权是在认证通过后,限制用户只能访问其权限范围内的资源,Spring Security 提供多层次的授权能力:

  1. URL 级别授权
    • 基于 URL 路径规则配置访问权限,例如:
      • 公开接口(如登录页、首页)允许匿名访问;
      • 普通用户接口仅允许 USER 角色访问;
      • 管理员接口仅允许 ADMIN 角色访问。
  2. 方法级别授权
    • 通过注解(如 @PreAuthorize@PostAuthorize)在方法上直接定义权限规则,细粒度控制业务逻辑的访问权限。
  3. 动态权限与数据权限
    • 支持从数据库动态加载权限规则(而非硬编码),适合权限频繁变更的系统(如后台管理系统)。
    • 结合业务逻辑实现数据级权限控制,例如:用户只能查看自己创建的订单、部门经理只能管理本部门员工等。

安全防护:抵御常见攻击

Spring Security 内置了对多种常见安全威胁的防护机制,无需手动实现:

  1. CSRF(跨站请求伪造)防护
    • 默认启用 CSRF 令牌验证,防止恶意网站利用用户已登录的会话发起非预期请求(如转账、删帖)。
    • 前后端分离场景可按需关闭(需确保使用 Token 认证且前端无法获取 Cookie)。
  2. XSS(跨站脚本攻击)防护
    • 自动添加安全响应头(如 X-XSS-Protection),并支持通过配置增强对输入输出的过滤。
  3. 会话管理安全
    • 防止会话固定攻击:登录时自动更换会话 ID。
    • 控制并发登录:限制同一用户同时登录的设备数量(如只允许一台设备在线)。
    • 会话过期管理:配置会话超时时间,自动失效并跳转至登录页。
  4. CORS(跨域资源共享)控制
    • 允许配置信任的域名、请求方法和 headers,防止未授权的跨域访问。
  5. 其他防护
    • 防止暴力破解:可集成验证码、登录失败次数限制(如 5 次失败后锁定账号)。
    • 敏感数据保护:通过密码加密、传输层 TLS 支持(HTTPS)确保数据安全。

集成与扩展:适配复杂架构

Spring Security 并非孤立存在,而是能与 Spring 生态及主流技术无缝集成:

  1. 与 Spring Boot 集成
    • 通过 spring-boot-starter-security 依赖实现 “开箱即用”,自动配置基础安全功能(如默认登录页、密码加密等),开发者只需少量配置即可定制需求。
  2. 与 Spring Cloud 集成(微服务场景)
    • 实现统一认证授权:通过 OAuth2.0 授权服务器集中颁发令牌,资源服务器验证令牌,解决微服务间的身份信任问题。
    • 网关层安全:结合 Spring Cloud Gateway 在网关集中处理认证(如验证 JWT),避免每个服务重复实现安全逻辑。
    • 单点登录(SSO):用户一次登录即可访问多个关联服务(如企业内部的 OA、CRM 系统)。
  3. 与其他技术栈集成
    • 支持与 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-OptionsX-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 不可修改(一旦生成无法撤销),需合理设置过期时间 + 刷新令牌机制;敏感信息不应存入载荷(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:不再通过继承该类配置安全规则,改为通过组件式配置(定义 SecurityFilterChainUserDetailsService 等 Bean)。
  • 强化函数式风格配置:支持通过 Lambda 表达式定义安全规则(如 authorizeHttpRequests(auth -> auth.anyRequest().authenticated()))。
  • OAuth2 模块重构:原 spring-security-oauth2 被拆分,授权服务器功能由独立的 spring-security-oauth2-authorization-server 模块实现(更符合 OAuth2.1 规范)。
  • 默认安全增强:默认启用 CSRF 防护、更严格的 CORS 策略、密码加密算法升级(推荐 Argon2、BCrypt 等)。