【Spring Security】Spring Security 概念

Spring Security

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" 模型

核心结构:

mathematica 复制代码
[请求进来]
   ↓
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、自定义认证源

典型应用场景

  1. 传统 Web 应用:使用表单登录 + Session + 角色控制
  2. 前后端分离应用:使用 JWT Token + REST API 鉴权
  3. 企业系统:集成 LDAP、SSO、Kerberos、CAS
  4. 微服务架构:使用 OAuth2 + Gateway + Resource Server 构建统一安全体系
  5. 自定义安全体系:手机号验证码登录、扫码登录、第三方授权等

总结一句话

Spring Security = 安全框架 + 策略体系 + 高度可定制的认证与授权机制。

它不仅仅是"登录验证"的工具,更是能支撑企业级系统安全架构的"安全中枢"。

架构

架构概述

Spring Security 的架构核心思想是:

通过过滤器链(Filter Chain)拦截请求,对请求进行认证与授权,并保证整个应用的安全性。

架构从 Servlet Filter 层 开始,所有请求都会经过 Spring Security 的安全过滤器链:

  1. 请求进入应用
  2. Security Filter Chain 拦截请求
  3. 执行认证(Authentication)
  4. 执行授权(Authorization)
  5. 通过或拒绝请求,交给 Controller 处理

核心目标:

  • 拦截未经授权或恶意请求;
  • 在请求到达业务逻辑之前进行安全检查;
  • 提供统一的安全上下文(Security Context)。

核心组件与职责

  1. AuthenticationFilter(认证过滤器)

    • 作用:拦截用户请求,将请求信息转换为 Authentication 对象,并委托给 AuthenticationManager 处理。
    • 特点:
      • 可以支持多种认证方式(表单登录、Token、Basic Auth 等)。
      • 可以自定义过滤器顺序,或添加额外逻辑(如验证码验证)。

    流程示意:

    mathematica 复制代码
    HTTP Request → AuthenticationFilter → AuthenticationManager
  2. AuthenticationManager(认证管理器)

    • 核心策略接口,负责执行认证逻辑。
    • 核心方法:
    java 复制代码
    Authentication authenticate(Authentication authentication) throws AuthenticationException;
    • 功能:
      1. 判断请求是否可认证;
      2. 调用 AuthenticationProvider 完成具体认证;
      3. 成功返回 Authentication 对象,失败抛出异常。
    • 实现类
      • 最常用的是 ProviderManager,它可以管理多个 AuthenticationProvider
  3. AuthenticationProvider(认证提供者)

    • 职责:真正执行用户身份验证。
    • 核心接口方法:
    java 复制代码
    Authentication authenticate(Authentication authentication) throws AuthenticationException;
    boolean supports(Class<?> authentication);
    • 工作流程:
      1. supports() 检查是否支持当前认证类型;
      2. 如果支持,调用 authenticate() 方法执行认证逻辑;
      3. 通常会调用 UserDetailsService.loadUserByUsername() 获取用户信息;
      4. 校验密码或其他认证信息;
      5. 成功返回 Authentication 对象,失败抛异常。

    注意:

    • 可以同时配置多个 AuthenticationProvider,例如:
      • DaoAuthenticationProvider(基于数据库)
      • LdapAuthenticationProvider(基于 LDAP)
      • 自定义 Provider(支持手机号 + OTP 等)
  4. UserDetailsService(用户信息服务)

    • 核心接口,用于加载用户数据。
    • 核心方法:
    java 复制代码
    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
    • 通常用于数据库或第三方用户存储:
      • 查询用户基本信息(用户名、密码、状态)
      • 查询权限信息(Roles / Authorities)
    • Spring Security 通过 UserDetailsService 获取用户信息并验证。
  5. PasswordEncoder(密码编码器)

    • 从 Spring Security 5 开始,必须使用加密密码
    • 常见实现:
      • BCryptPasswordEncoder:推荐,用于生产环境
      • NoOpPasswordEncoder:明文密码,仅用于开发或测试
    • 功能:
      • 对用户输入的密码进行加密比对
      • 防止明文密码泄露
  6. SecurityContext(安全上下文)

    • 作用 :保存当前会话的认证信息(Authentication 对象)。
    • 提供全局访问:
    java 复制代码
    SecurityContextHolder.getContext().getAuthentication();
    SecurityContextHolder.getContext().setAuthentication(auth);
    • 典型用途:
      • 在业务逻辑中获取当前用户信息
      • 判断用户权限
    • 安全上下文在请求期间保持线程安全,通常通过 ThreadLocal 存储。

整个请求处理流程可以总结为:

mathematica 复制代码
HTTP Request → Security Filter Chain → AuthenticationFilter → AuthenticationManager → AuthenticationProvider → UserDetailsService → PasswordEncoder → SecurityContextHolder → Controller

详细步骤:

  1. 用户发起请求(如登录、访问接口)
  2. AuthenticationFilter 拦截请求并构建 Authentication 对象
  3. AuthenticationManager 调用 AuthenticationProvider 认证
  4. AuthenticationProvider 调用 UserDetailsService 获取用户信息,并用 PasswordEncoder 验证
  5. 成功认证后,结果保存到 SecurityContext
  6. 请求继续向下游传递
  7. 在访问控制时,基于 Authentication 和权限注解进行授权检查
  8. 授权成功 → Controller 执行业务逻辑;失败 → 返回 403 / 拒绝访问

Form Login 自定义流程

Spring Security 提供 默认表单登录,也可自定义:

  1. 默认行为:
    • 自动生成登录表单
    • 配置默认用户(in-memory)
    • 自动设置 Filter、AuthenticationManager、Provider
  2. 自定义:
    • 提供自己的登录表单(URI、参数名)
    • 使用 usernameParameter()passwordParameter() 指定字段
    • Spring Security 负责渲染表单并执行认证逻辑
    • 可与数据库用户表、JWT Token、第三方认证结合

要点:

  • 自定义表单必须包含 usernamepassword(或告知 Spring Security 自定义字段)
  • 可集成额外逻辑,如验证码、2FA、登录失败处理、"记住我"功能等

项目模块

模块化设计

Spring Security 的代码库被拆分为多个 jar 模块,每个模块针对不同功能和依赖场景:

  • 好处
    1. 按需引入依赖,减小应用体积。
    2. 功能模块化,便于维护与升级。
    3. 可根据企业需求灵活组合,如只用 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 → 核心接口和类,如 AuthenticationGrantedAuthority

    • org.springframework.security.access → 授权相关类,如 AccessDecisionManagerAccessDecisionVoter

    • org.springframework.security.authentication → 认证相关类,如 AuthenticationManagerProviderManager

    • org.springframework.security.provisioning → 用户管理,如 UserDetailsManagerJdbcUserDetailsManager

    • org.springframework.security.remoting → 支持远程方法调用(RMI / HttpInvoker)。

  • 使用场景

    • 所有 Spring Security 应用必须引入。

    • 核心业务层和自定义认证 Provider 实现。

Web − spring-security-web.jar

  • 作用

    • 提供 Web 层安全功能
    • 包含基于 URL 的访问控制、过滤器链和 Servlet 支持。
  • 包含的包org.springframework.security.web → 安全过滤器,如 FilterSecurityInterceptorUsernamePasswordAuthenticationFilter 等。

  • 使用场景

    • 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 安全模块,其他模块根据需求引入。

相关推荐
小信丶6 小时前
Spring 中解决 “Could not autowire. There is more than one bean of type“ 错误
java·spring
心止水j6 小时前
spark
javascript·数据库·spark
周杰伦_Jay7 小时前
【Java虚拟机(JVM)全面解析】从原理到面试实战、JVM故障处理、类加载、内存区域、垃圾回收
java·jvm
xujiangyan_7 小时前
Redis详解
数据库·redis·缓存
Y编程小白10 小时前
PostgreSQL在Linux中的部署和安装教程
数据库·postgresql
程序员小凯10 小时前
Spring Boot测试框架详解
java·spring boot·后端
豐儀麟阁贵10 小时前
基本数据类型
java·算法
_extraordinary_11 小时前
Java SpringMVC(二) --- 响应,综合性练习
java·开发语言
程序员 Harry11 小时前
深度解析:使用ZIP流式读取大型PPTX文件的最佳实践
java