【Spring Security】Spring Security 概念
Spring Security
- Spring Security 基础
- 简介
- Spring Security 是什么?
- Spring Security 的核心思想
- Spring Security 支持的认证方式
- Spring Security 的特点
- 架构
- 架构概述
- 核心组件与职责
- Form Login 自定义流程
- 项目模块
- 模块化设计
- 核心模块介绍
- 模块关系和依赖
Spring Security 基础
简介
Spring Security 是什么?
Spring Security 是 Spring 家族中的一个 安全框架(Security Framework),它的目标是:
保护基于 Spring 的应用程序免受未经授权的访问。
换句话说:
- 它是 Spring 官方提供的安全解决方案;
- 它的核心职责是 认证(Authentication) 与 授权(Authorization);
- 它通过大量的 内置机制 + 高度可扩展的接口,让我们能轻松实现各种复杂安全需求。
可以理解为:
Spring Security 是 Spring 的安全中间层,用来控制谁能访问应用、能访问什么内容、在什么条件下访问。
Spring Security 的核心思想
Spring Security 的核心有两大模块:
Authentication(认证)
认证是“你是谁?”的问题。系统需要确认访问者的身份,例如:
- 用户名 + 密码
- 手机号 + 验证码
- Token、JWT
- OAuth2 授权码
- 指纹、人脸、硬件证书(X.509)等
在 Spring Security 中,认证通过一系列组件完成:
Authentication
(认证信息)AuthenticationManager
(认证管理器)AuthenticationProvider
(认证逻辑实现)UserDetailsService
(用户信息获取)PasswordEncoder
(密码加密)
这些组件相互协作,让开发者可以在内置流程中轻松插入自定义逻辑,比如:
自定义登录表单、自定义用户信息源、自定义认证方式(如手机号+验证码登录)。
Authorization(授权)
授权是“你能做什么?”的问题。当用户身份确认后,系统还要判断:
- 用户是否有权访问某个接口或资源?
- 用户是否具备执行某个操作的权限?
Spring Security 提供两种主要方式:
- 基于角色的访问控制(RBAC):例如
hasRole("ADMIN")
- 基于表达式的访问控制(SpEL):例如
@PreAuthorize("hasAuthority('sys:user:delete')")
从 Spring Security 5 开始,也支持更灵活的:
- 基于 Claim / Token 的授权
- 基于方法级安全(Method Security)
- 基于资源服务的授权(OAuth2 Resource Server)
Spring Security 支持的认证方式
Spring Security 是一个非常开放的框架,它几乎支持所有主流认证协议:
类型 | 示例 |
---|---|
HTTP 基本认证 | Basic Auth(用户名+密码 Base64 编码) |
HTTP Digest | 更安全的摘要式认证 |
表单登录(Form Login) | 自定义登录页、登录处理逻辑 |
X.509 客户端证书认证 | 通过数字证书验证身份 |
LDAP 认证 | 通过轻量级目录访问协议认证(企业常用) |
OpenID / OAuth2 / SSO | 第三方登录(如 Google、GitHub 登录) |
Remember-Me | 记住我功能 |
Anonymous Authentication | 匿名访问 |
Pre-Authenticated | 在代理或前置认证系统(如 CAS)之后使用 |
JAAS / JEE / Kerberos / Crowd | 企业级安全协议支持 |
此外,Spring Security 也支持完全 自定义认证机制,例如:
手机号 + 验证码登录、邮箱 + 链接登录、双因子认证(2FA / OTP)等。
Spring Security 的特点
Spring Security 的高度可定制性
Spring Security 之所以强大,是因为它的设计思想是 “Filter + Provider + Context” 模型。
核心结构:
[请求进来]↓
Security Filter Chain(多个过滤器)↓
AuthenticationManager↓
AuthenticationProvider(可以有多个)↓
UserDetailsService↓
SecurityContextHolder(存储认证结果)↓
[请求到达Controller]
这套体系让开发者可以:
- 替换默认的过滤器(例如:改写用户名密码校验逻辑)
- 添加自定义过滤器(例如:Token 解析、IP 限制、防暴力登录)
- 插入自定义 Provider(例如:支持手机号 + 验证码认证)
也就是说,Spring Security 提供了一套“骨架”,我们可以在上面自由换“器官”。
Spring Security 的优势
特性 | 说明 |
---|---|
强大且灵活 | 支持所有主流认证方式,可完全自定义 |
模块化设计 | 认证、授权、过滤器解耦 |
与 Spring 紧密集成 | 与 Spring Boot、Spring MVC 无缝衔接 |
安全性高 | 支持加密、CSRF、防盗链、防会话劫持 |
支持 OAuth2 / JWT / SSO | 适用于现代分布式系统与微服务架构 |
扩展性强 | 支持插件式 Provider、Filter、自定义认证源 |
典型应用场景
- 传统 Web 应用:使用表单登录 + Session + 角色控制
- 前后端分离应用:使用 JWT Token + REST API 鉴权
- 企业系统:集成 LDAP、SSO、Kerberos、CAS
- 微服务架构:使用 OAuth2 + Gateway + Resource Server 构建统一安全体系
- 自定义安全体系:手机号验证码登录、扫码登录、第三方授权等
总结一句话
Spring Security = 安全框架 + 策略体系 + 高度可定制的认证与授权机制。
它不仅仅是“登录验证”的工具,更是能支撑企业级系统安全架构的“安全中枢”。
架构
架构概述
Spring Security 的架构核心思想是:
通过过滤器链(Filter Chain)拦截请求,对请求进行认证与授权,并保证整个应用的安全性。
架构从 Servlet Filter 层 开始,所有请求都会经过 Spring Security 的安全过滤器链:
- 请求进入应用
- Security Filter Chain 拦截请求
- 执行认证(Authentication)
- 执行授权(Authorization)
- 通过或拒绝请求,交给 Controller 处理
核心目标:
- 拦截未经授权或恶意请求;
- 在请求到达业务逻辑之前进行安全检查;
- 提供统一的安全上下文(Security Context)。
核心组件与职责
-
AuthenticationFilter(认证过滤器)
- 作用:拦截用户请求,将请求信息转换为
Authentication
对象,并委托给AuthenticationManager
处理。 - 特点:
- 可以支持多种认证方式(表单登录、Token、Basic Auth 等)。
- 可以自定义过滤器顺序,或添加额外逻辑(如验证码验证)。
流程示意:
HTTP Request → AuthenticationFilter → AuthenticationManager
- 作用:拦截用户请求,将请求信息转换为
-
AuthenticationManager(认证管理器)
- 核心策略接口,负责执行认证逻辑。
- 核心方法:
Authentication authenticate(Authentication authentication) throws AuthenticationException;
- 功能:
- 判断请求是否可认证;
- 调用
AuthenticationProvider
完成具体认证; - 成功返回
Authentication
对象,失败抛出异常。
- 实现类:
- 最常用的是
ProviderManager
,它可以管理多个AuthenticationProvider
。
- 最常用的是
-
AuthenticationProvider(认证提供者)
- 职责:真正执行用户身份验证。
- 核心接口方法:
Authentication authenticate(Authentication authentication) throws AuthenticationException; boolean supports(Class<?> authentication);
- 工作流程:
supports()
检查是否支持当前认证类型;- 如果支持,调用
authenticate()
方法执行认证逻辑; - 通常会调用
UserDetailsService.loadUserByUsername()
获取用户信息; - 校验密码或其他认证信息;
- 成功返回
Authentication
对象,失败抛异常。
注意:
- 可以同时配置多个
AuthenticationProvider
,例如:DaoAuthenticationProvider
(基于数据库)LdapAuthenticationProvider
(基于 LDAP)- 自定义 Provider(支持手机号 + OTP 等)
-
UserDetailsService(用户信息服务)
- 核心接口,用于加载用户数据。
- 核心方法:
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
- 通常用于数据库或第三方用户存储:
- 查询用户基本信息(用户名、密码、状态)
- 查询权限信息(Roles / Authorities)
- Spring Security 通过
UserDetailsService
获取用户信息并验证。
-
PasswordEncoder(密码编码器)
- 从 Spring Security 5 开始,必须使用加密密码。
- 常见实现:
BCryptPasswordEncoder
:推荐,用于生产环境NoOpPasswordEncoder
:明文密码,仅用于开发或测试
- 功能:
- 对用户输入的密码进行加密比对
- 防止明文密码泄露
-
SecurityContext(安全上下文)
- 作用:保存当前会话的认证信息(
Authentication
对象)。 - 提供全局访问:
SecurityContextHolder.getContext().getAuthentication(); SecurityContextHolder.getContext().setAuthentication(auth);
- 典型用途:
- 在业务逻辑中获取当前用户信息
- 判断用户权限
- 安全上下文在请求期间保持线程安全,通常通过
ThreadLocal
存储。
- 作用:保存当前会话的认证信息(
整个请求处理流程可以总结为:
HTTP Request → Security Filter Chain → AuthenticationFilter → AuthenticationManager → AuthenticationProvider → UserDetailsService → PasswordEncoder → SecurityContextHolder → Controller
详细步骤:
- 用户发起请求(如登录、访问接口)
AuthenticationFilter
拦截请求并构建Authentication
对象AuthenticationManager
调用AuthenticationProvider
认证AuthenticationProvider
调用UserDetailsService
获取用户信息,并用PasswordEncoder
验证- 成功认证后,结果保存到
SecurityContext
中 - 请求继续向下游传递
- 在访问控制时,基于
Authentication
和权限注解进行授权检查 - 授权成功 → Controller 执行业务逻辑;失败 → 返回 403 / 拒绝访问
Form Login 自定义流程
Spring Security 提供 默认表单登录,也可自定义:
- 默认行为:
- 自动生成登录表单
- 配置默认用户(in-memory)
- 自动设置 Filter、AuthenticationManager、Provider
- 自定义:
- 提供自己的登录表单(URI、参数名)
- 使用
usernameParameter()
和passwordParameter()
指定字段 - Spring Security 负责渲染表单并执行认证逻辑
- 可与数据库用户表、JWT Token、第三方认证结合
要点:
- 自定义表单必须包含
username
和password
(或告知 Spring Security 自定义字段) - 可集成额外逻辑,如验证码、2FA、登录失败处理、“记住我”功能等
项目模块
模块化设计
Spring Security 的代码库被拆分为多个 jar 模块,每个模块针对不同功能和依赖场景:
- 好处:
- 按需引入依赖,减小应用体积。
- 功能模块化,便于维护与升级。
- 可根据企业需求灵活组合,如只用 Web + Core,而不引入 LDAP 或 CAS。
- 加载方式:
- 在 Maven 或 Gradle 中,开发者只需引入需要的模块。
- 依赖的模块之间有层级关系,比如
spring-security-web
依赖spring-security-core
。
核心模块介绍
Core − spring-security-core.jar
-
作用:
-
核心模块,任何 Spring Security 功能都依赖它。
-
提供 认证(Authentication)、授权(Access Control)、远程调用支持和基础用户管理。
-
-
包含的包:
-
org.springframework.security.core
→ 核心接口和类,如Authentication
、GrantedAuthority
。 -
org.springframework.security.access
→ 授权相关类,如AccessDecisionManager
、AccessDecisionVoter
。 -
org.springframework.security.authentication
→ 认证相关类,如AuthenticationManager
、ProviderManager
。 -
org.springframework.security.provisioning
→ 用户管理,如UserDetailsManager
、JdbcUserDetailsManager
。 -
org.springframework.security.remoting
→ 支持远程方法调用(RMI / HttpInvoker)。
-
-
使用场景:
-
所有 Spring Security 应用必须引入。
-
核心业务层和自定义认证 Provider 实现。
-
Web − spring-security-web.jar
-
作用:
- 提供 Web 层安全功能。
- 包含基于 URL 的访问控制、过滤器链和 Servlet 支持。
-
包含的包:
org.springframework.security.web
→ 安全过滤器,如FilterSecurityInterceptor
、UsernamePasswordAuthenticationFilter
等。 -
使用场景:
- Web 应用、REST API。
- URL 权限控制、Session 管理、防止 CSRF 等。
Config − spring-security-config.jar
- 作用:提供 Spring Security XML 命名空间解析 和 Java 配置支持。
- 包含的包:
org.springframework.security.config
→ 支持<security:*>
标签的解析。 - 使用场景:
- 使用 XML 配置安全策略(较少用,Spring Boot 通常用 Java Config)。
- 定制 FilterChain、AuthenticationManager 等配置。
LDAP − spring-security-ldap.jar
- 作用:提供 LDAP 身份验证和用户管理。
- 包含的包:
org.springframework.security.ldap
→ LDAP 认证 Provider、查询、用户映射。 - 使用场景:
- 企业系统中使用 Active Directory 或其他 LDAP 服务器进行认证。
- 结合
spring-security-core
提供统一安全上下文。
ACL − spring-security-acl.jar
-
作用:
- 针对 领域对象(Domain Object) 的 精细访问控制(ACL)。
- 支持为特定对象实例分配权限(不仅是角色)。
-
包含的包:
org.springframework.security.acl
→ ACL 权限检查、权限授予、权限继承。 -
使用场景:企业系统对对象级别访问有严格需求,如文件、合同、订单等。
CAS − spring-security-cas-client.jar
-
作用:
提供 CAS 单点登录(SSO)客户端集成。
-
包含的包:
org.springframework.security.cas
→ CAS 认证 Filter、Ticket 验证器。 -
使用场景:
- 大型企业中,统一认证服务器 + 多系统 SSO。
- Spring Security Web 应用与 CAS Server 集成。
OpenID − spring-security-openid.jar
- 作用:提供 OpenID 登录支持。
- 包含的包:
org.springframework.security.openid
→ OpenID 身份验证 Filter、解析器。 - 使用场景:
- 第三方登录,如 Google、Yahoo 登录。
- 用于 Web 应用的外部认证集成。
模块关系和依赖
模块 | 依赖 | 功能重点 |
---|---|---|
Core | 无依赖 | 认证、授权、用户管理、远程调用 |
Web | Core | Filter、URL 权限、Web 安全策略 |
Config | Core, Web | XML / Java 配置解析 |
LDAP | Core | LDAP 认证、用户管理 |
ACL | Core | 领域对象权限控制 |
CAS | Core, Web | CAS SSO 集成 |
OpenID | Core, Web | OpenID 第三方认证 |
所有模块都依赖 Core,Web 是最常用的 Web 安全模块,其他模块根据需求引入。