当前位置: 首页 > news >正文

【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、自定义认证源

典型应用场景

  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)。

核心组件与职责

Components of Spring Security Architecture

  1. AuthenticationFilter(认证过滤器)

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

    流程示意:

    HTTP Request → AuthenticationFilter → AuthenticationManager
    
  2. AuthenticationManager(认证管理器)

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

    • 职责:真正执行用户身份验证。
    • 核心接口方法:
    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(用户信息服务)

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

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

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

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

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无依赖认证、授权、用户管理、远程调用
WebCoreFilter、URL 权限、Web 安全策略
ConfigCore, WebXML / Java 配置解析
LDAPCoreLDAP 认证、用户管理
ACLCore领域对象权限控制
CASCore, WebCAS SSO 集成
OpenIDCore, WebOpenID 第三方认证

所有模块都依赖 Core,Web 是最常用的 Web 安全模块,其他模块根据需求引入。

http://www.dtcms.com/a/469195.html

相关文章:

  • 杂记 12
  • 织梦程序如何搭建网站洛阳凯锦腾网业有限公司
  • Socket网络编程(2)-command_server
  • vscode 连接远程服务器同步方法
  • 传统数据安全措施与云计算数据安全的区别
  • Linux下如何在vim里使用异步编译和运行?
  • Python高效实现Excel转PDF:无Office依赖的轻量化方案
  • 做网站PPPOE网络可以吗一个好网站设计
  • 混淆矩阵在金融领域白话解说
  • 深耕金融调研领域,用科学调研破解银行服务困境(市场调研)
  • 未备案网站处理系统写作墨问题 网站
  • 【Linux】手搓日志(附源码)
  • Excel 下拉选项设置 级联式
  • pycharm自动化测试初始化
  • nacos3.0.4升级到3.1.0
  • linux入门5.5(高可用)
  • JAVA·数组的定义与使用
  • Transformer 面试题及详细答案120道(81-90)-- 性能与评估
  • 可以做软件的网站有哪些功能中国新闻社待遇
  • 【鉴权架构】SpringBoot + Sa-Token + MyBatis + MySQL + Redis 实现用户鉴权、角色管理、权限管理
  • 三星S25Ultra/S24安卓16系统Oneui8成功获取完美root权限+LSP框架
  • ffmpeg 播放视频 暂停
  • 老题新解|大整数的因子
  • Eureka的自我保护机制
  • 探索颜色科学:从物理现象到数字再现
  • AirSim_SimJoyStick
  • 第五部分:VTK高级功能模块(第149章 Remote模块 - 远程模块类)
  • 道可云人工智能每日资讯|《政务领域人工智能大模型部署应用指引》发布
  • 自己做网站哪家好win10 wordpress安装教程视频
  • wordpress整体搬迁宁波seo深度优化平台有哪些