SpringSecurity6.5.8 核心流程解析
引言
本文旨在梳理 Spring Security 6.5.8 版本的核心执行流程,核心用途为个人学习巩固与复习复盘,同时也希望能为有同样学习需求的小伙伴提供一份清晰的思路参考。Spring Security 作为 Spring 生态中最主流的安全框架,负责处理认证、授权、防攻击等核心安全场景,而 6.5.8 作为稳定常用的版本,其核心流程既延续了 Spring Security 的经典设计,也包含了对应版本的细节优化。
由于本人仍处于 Spring Security 深入学习阶段,对框架底层原理的理解可能存在疏漏或偏差,文中若有表述不当、逻辑错误或细节遗漏之处,恳请各位大佬、小伙伴留言指正,万分感谢。后续将逐步拆解核心流程的各个环节,从请求拦截到认证授权,再到过滤器链的执行,力求用通俗的语言结合技术细节,把关键节点讲清楚、讲明白,助力自己和大家扎实掌握 Spring Security 6.5.8 的核心逻辑,夯实技术基础。
一 核心组件及作用
Spring Security 的核心流程依赖于一系列组件的协同工作,这些组件各司其职、相互配合,共同完成认证、授权等安全操作。以下结合版本特性,罗列核心组件并说明其核心作用,方便学习复习时快速梳理关键知识点:
1. FilterChainProxy(过滤器链代理)
核心作用:Spring Security 拦截请求的核心入口,负责管理所有安全相关的过滤器(Filter),并按照指定顺序执行过滤器链。Spring Security 6.5.8 中,所有请求都会先经过 FilterChainProxy,由其将请求分发到对应的过滤器(如认证过滤器、授权过滤器、防csrf攻击过滤器等)。过滤器链的执行顺序至关重要,直接影响安全流程的正确性,后续解析核心流程时会详细说明过滤器链的执行顺序。
2. SecurityContextRepository(安全上下文仓库)
核心作用:连接请求与 SecurityContext 的核心桥梁,负责在请求到来时从仓库里面加载安全上下文到SecurityContextHolder,是实现“跨请求保持登录状态”的关键组件。
3. SecurityContextHolder(安全上下文持有者)
核心作用:用于存储当前登录用户的安全上下文信息(包含认证信息 SecurityContext),是整个框架中获取用户信息的核心入口。Spring Security 6.5.8 中默认采用 ThreadLocal 存储方式,保证了单个请求线程内的安全上下文隔离,即每个请求线程都有独立的 SecurityContext,避免多线程并发时的信息混乱。我们可以通过 SecurityContextHolder.getContext() 方法,随时随地获取当前用户的认证状态、权限信息等。
4. SecurityContext(安全上下文)
核心作用:封装当前用户的认证结果,是 SecurityContextHolder 存储的核心内容。其内部持有一个 Authentication 对象,当用户认证成功后,Authentication 对象会被存入 SecurityContext;若未认证或认证失败,则 Authentication 为系统默认创建一个匿名身份的Authentication 。简单来说,SecurityContext 就是当前用户的“安全身份档案”,记录了用户是否已认证、认证的用户信息等关键内容。
5. Authentication(认证对象)
核心作用:代表用户的认证信息,是认证流程的核心载体。其核心属性包括:用户名(principal)、密码(credentials,认证成功后会被清空,保障安全)、权限集合(authorities)、认证状态(authenticated,true 表示已认证,false 表示未认证)。在认证流程中,AuthenticationManager 会对 Authentication 对象进行校验,校验通过后返回一个已认证的 Authentication 对象,并存入 SecurityContext。
6. AuthenticationManager(认证管理器)
核心作用:负责统一管理认证逻辑,是认证流程的“入口”。Spring Security 6.5.8 中,AuthenticationManager 的核心实现类是 ProviderManager,其内部维护了一个 List<AuthenticationProvider> 集合,采用“责任链模式”处理认证请求——即依次调用各个 AuthenticationProvider 进行认证,只要有一个 Provider 认证成功,就视为整体认证成功;若所有 Provider 都认证失败,则认证失败。我们在自定义认证逻辑时,核心就是自定义 AuthenticationProvider 并注册到 AuthenticationManager 中。
7. AuthenticationProvider(认证提供者)
核心作用:具体执行认证逻辑的组件,是 AuthenticationManager 的“具体执行者”。Spring Security 6.5.8 提供了多个默认实现,例如 DaoAuthenticationProvider(基于数据库查询的认证,也是最常用的实现,支持密码加密校验)、AnonymousAuthenticationProvider(匿名用户认证)等。每个 AuthenticationProvider 都有自己的认证逻辑,我们可以通过自定义 AuthenticationProvider,实现如短信验证、邮箱认证等自定义认证场景。
8. UserDetailsService(用户详情服务)
核心作用:负责加载用户的详细信息(如用户名、密码、权限、账号状态等),是认证流程中“获取用户信息”的核心组件。DaoAuthenticationProvider 认证时,会调用 UserDetailsService 的 loadUserByUsername(String username) 方法,根据用户名查询数据库或其他存储介质中的用户信息,返回 UserDetails 对象,供后续密码校验、权限判断使用。学习复习时需注意,UserDetailsService 仅负责“加载用户信息”,不负责密码校验,密码校验由 AuthenticationProvider 完成。
9. UserDetails(用户详情)
核心作用:封装用户的详细信息,是 UserDetailsService 的返回值,也是 Spring Security 内部识别用户的标准模型。其核心方法包括:getUsername()(获取用户名)、getPassword()(获取加密后的密码)、getAuthorities()(获取用户权限集合)、isAccountNonExpired()(账号是否未过期)、isAccountNonLocked()(账号是否未锁定)等。Spring Security 6.5.8 中,默认的 UserDetails 实现类是 User,我们也可以自定义 UserDetails 实现,扩展用户信息(如用户昵称、手机号等)。
10. PasswordEncoder(密码加密器)
核心作用:负责密码的加密与校验,是保障密码安全的核心组件。Spring Security 6.5.8 中,默认强制要求使用密码加密(取消了明文密码支持),常用的实现类有 BCryptPasswordEncoder(基于 BCrypt 算法,最常用,自动生成盐值,加密强度可配置)。其核心方法包括 encode(CharSequence rawPassword)(加密明文密码)、matches(CharSequence rawPassword, String encodedPassword)(校验明文密码与加密密码是否匹配)。
11. AuthorizationManager(授权管理器)
核心作用:授权决策的核心接口,负责统一处理“已认证用户是否有权限访问目标资源”的逻辑,是现代 Spring Security 授权体系的基石,也是 6.5.8 版本中授权流程的核心组件。相较于传统的 AccessDecisionManager,它采用更简洁的函数式设计,天然支持方法级安全(@PreAuthorize 等)和请求级安全(URL 拦截)的统一适配,是实现自定义授权规则的首选。其内部可结合授权投票器或自定义逻辑,判断用户权限与目标资源所需权限是否匹配,最终决定是否允许访问。Spring Security 6.5.8 中,配置类(SecurityFilterChain)中通过 authorizeHttpRequests() 配置的授权规则,底层均由 AuthorizationManager 接管,例如经典的 URL 权限配置,本质就是构建 RequestMatcherDelegatingAuthorizationManager 来完成授权决策。
二 核心Filter作用及执行过程
Spring Security 的核心流程本质是 “过滤器链的执行”,所有认证、授权、安全防护逻辑,均通过一系列 Filter 依次执行完成。FilterChainProxy 作为过滤器链的入口,会按固定顺序调用各个核心 Filter,每个 Filter 负责特定的安全功能,协同完成整个安全流程。以下重点梳理 6.5.8 版本中最核心的 Filter 及其作用。下图为几个核心处理器的执行过程:

1. SecurityContextHolderFilter(安全上下文持有过滤器)
核心定位:过滤器链的首个核心执行组件,核心作用:与 SecurityContextRepository、SecurityContextHolder 深度协同,完成请求生命周期内的上下文管理:请求进入时:调用 SecurityContextRepository.loadContext() 从安全上下文仓库(内存/redis等)加载上下文,存入 SecurityContextHolder。请求结束时:调用securityContextHolderStrategy.clearContext(),清空 SecurityContextHolder 的 中的SecurityContext数据,防止内存泄漏。是 “跨请求保持登录状态” 的基础。
2. LogoutFilter(注销过滤器)
核心定位:认证流程前置的注销请求拦截组件;核心作用:优先拦截注销请求(默认匹配 POST 方式的 /logout 接口,实际场景中通常关闭此过滤器,改用自定义注销方法实现);核心逻辑:匹配到注销请求时,清除 SecurityContextHolder 中的安全上下文,调用 SecurityContextRepository 清理存储介质中的登录状态,最后执行注销成功处理器(如页面跳转、返回 JSON 响应)。可通过实现 LogoutSuccessHandler 接口自定义注销成功后的处理逻辑。
3. UsernamePasswordAuthenticationFilter(用户名密码认证过滤器)
核心作用:负责处理用户名 + 密码模式的认证请求,默认拦截 POST 类型的 /login 接口(实际开发中一般关闭该过滤器,通过自定义登录方法实现登录);其核心执行逻辑是:拦截登录请求后,先提取请求中的用户名和密码,封装成 UsernamePasswordAuthenticationToken(Authentication 接口的实现类),再调用 AuthenticationManager 进行认证,最后根据认证结果执行对应逻辑(成功则跳转页面,失败则返回错误信息)。若需自定义认证结果处理逻辑,可实现 AuthenticationSuccessHandler(如生成 Token、持久化 Token 信息)和 AuthenticationFailureHandler(如返回 JSON 格式的错误提示)。
4. AnonymousAuthenticationFilter(匿名认证过滤器)
核心作用:处理匿名用户的认证逻辑。若请求经过前面的认证过滤器后,SecurityContext 中仍无 Authentication 对象(即未认证),该 Filter 会自动创建一个匿名用户的 Authentication 对象(默认用户名 anonymousUser,权限 ROLE_ANONYMOUS),存入 SecurityContext,避免后续组件因 Authentication 为 null 报错。匿名用户并非“未认证用户”,而是 Spring Security 为未登录用户分配的“默认身份”,便于统一授权逻辑(如配置 /public/** 允许匿名访问)。
5. ExceptionTranslationFilter(异常转换过滤器)
核心作用:捕获过滤器链后续执行过程中抛出的安全相关异常(如认证失败、授权失败),并将异常转换为对应的 HTTP 响应或页面跳转逻辑。例如:认证失败 / 匿名用户访问需认证资源时跳转至登录页,授权失败时返回 403 禁止访问响应。该 Filter 是 Spring Security 异常处理的核心组件,默认逻辑可满足基础场景;若需自定义异常响应(如前后端分离项目返回 JSON 格式错误),可重写其异常处理逻辑。其核心处理两类异常:AuthenticationException(未认证时抛出的认证异常)、AccessDeniedException(权限不足时抛出的拒绝访问异常),可分别通过配置AuthenticationEntryPoint、AccessDeniedHandler自定义两类异常的处理逻辑(如返回 JSON 响应)。
6. AuthorizationFilter(授权过滤器)
核心作用:核心授权过滤器,通常为过滤器链的最后一个filter,底层由 AuthorizationManager 驱动,负责对已认证用户的访问权限进行校验。其逻辑:获取当前请求的资源信息(URL、Method)→获取当前用户的 Authentication 对象→调用 AuthorizationManager 进行授权决策→授权通过则放行,失败则抛出授权异常(由 ExceptionTranslationFilter 处理)。
三 总结
本文围绕 Spring Security 6.5.8 版本,从学习复习角度出发,梳理了框架的核心组件、核心 Filter 及其执行流程,旨在帮助自己和同是学习该框架的小伙伴,扎实掌握其核心逻辑。
核心总结:Spring Security 6.5.8 的安全流程,本质是“过滤器链流转+核心组件协同”——FilterChainProxy 作为入口,按固定顺序调用各核心 Filter,完成上下文初始化、认证、授权、异常处理及上下文收尾;SecurityContextHolder、SecurityContextRepository、AuthenticationManager、AuthorizationManager 等组件相互配合,分别负责上下文管理、认证逻辑、授权决策,构成了框架的核心骨架。
学习复习建议:重点掌握版本差异点(如废弃与新增的 Filter)、核心组件的职责及联动关系、Filter 执行顺序,结合实际 Demo 练习,能更快速地理解和运用框架。文中若有疏漏,欢迎各位留言指正,共同进步。
四、具体实现 Demo(无原理,仅讲操作)
以下附上 CSDN 平台的 Spring Security 6.5.8 具体实现 Demo 文章地址,该文章不讲解底层原理,仅聚焦于实际操作,从环境搭建、依赖导入到表单登录、权限控制、注销功能的完整实现,步骤清晰、可直接复制使用,适合学习复习时对照实操:
说明:该 Demo 文章包含完整的 pom.xml 依赖配置、Security 配置类、Controller 示例,覆盖用户名密码认证、权限控制、注销等核心功能,可直接用于项目快速集成或学习实操练习。
五 相关资源参考
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)