2026/1/16 14:25:34
网站建设
项目流程
南阳专业网站排名推广,阳泉网站建设费用,公司建网,工程建筑网目录
一、核心角色对应#xff08;责任链模式#xff09;
二、核心架构#xff1a;双层责任链设计
1. 外层#xff1a;FilterChainProxy#xff08;全局过滤器入口#xff09;
2. 内层#xff1a;SecurityFilterChain#xff08;具体过滤器链#xff09;
三、核心…目录一、核心角色对应责任链模式二、核心架构双层责任链设计1. 外层FilterChainProxy全局过滤器入口2. 内层SecurityFilterChain具体过滤器链三、核心流程以表单登录为例关键特点四、代码示例自定义过滤器链步骤 1自定义认证过滤器具体处理者步骤 2配置过滤器链责任链管理器步骤 3核心业务Controller责任链终点五、核心过滤器内置具体处理者六、责任链的核心实现源码简化1. FilterChainProxy外层管理器2. 关键逻辑七、Spring Security 责任链的核心特点1. 高度可定制2. 中断性与容错性3. 解耦性八、典型应用场景九、与 Spring MVC 拦截器链的区别总结Spring Security 的核心架构完全基于责任链模式设计其核心载体是过滤器链SecurityFilterChain—— 将认证、授权、防护等安全逻辑拆分为独立的过滤器Filter请求沿过滤器链按序执行每个过滤器负责单一安全职责最终实现完整的安全校验流程。核心目标将复杂的安全逻辑解耦为可插拔的过滤器组件支持灵活扩展和定制如新增验证码校验、JWT 认证、接口限流等。一、核心角色对应责任链模式责任链模式角色Spring Security 对应实现核心职责抽象处理者Handlerjavax.servlet.FilterServlet 过滤器/OncePerRequestFilter定义过滤器核心方法doFilter()约定请求处理规则Spring Security 过滤器多继承OncePerRequestFilter保证单次请求仅执行一次具体处理者内置过滤器如UsernamePasswordAuthenticationFilter、JwtAuthenticationFilter/ 自定义过滤器实现特定安全逻辑认证、授权、CSRF 防护等通过chain.doFilter()传递请求责任链管理器FilterChainProxySecurityFilterChainFilterChainProxy是顶级入口匹配请求对应的SecurityFilterChain触发过滤器链执行请求对象HttpServletRequest/HttpServletResponse被过滤器链处理的核心对象最终处理者目标资源Controller / 静态资源过滤器链执行完成后请求传递到核心业务逻辑二、核心架构双层责任链设计Spring Security 的责任链分为两层保证 “多规则适配 顺序执行”1. 外层FilterChainProxy全局过滤器入口FilterChainProxy是 Spring Security 注册到 Servlet 容器的唯一过滤器通过DelegatingFilterProxy适配其核心作用是根据请求路径匹配对应的SecurityFilterChain支持多套过滤器链如/api/**一套、/admin/**另一套触发匹配到的SecurityFilterChain执行。2. 内层SecurityFilterChain具体过滤器链每个SecurityFilterChain包含一组有序的过滤器ListFilter是真正执行安全逻辑的责任链例如plaintextUsernamePasswordAuthenticationFilter表单登录认证→ BasicAuthenticationFilterBasic 认证→ JwtAuthenticationFilterJWT 认证→ FilterSecurityInterceptor授权校验→ ExceptionTranslationFilter异常处理三、核心流程以表单登录为例plaintext客户端请求 → Tomcat → DelegatingFilterProxy → FilterChainProxy → 匹配 SecurityFilterChain → 执行过滤器链 1. CsrfFilterCSRF 防护→ 2. UsernamePasswordAuthenticationFilter表单登录认证→ 3. BasicAuthenticationFilterBasic 认证跳过→ 4. FilterSecurityInterceptor授权校验→ 5. ExceptionTranslationFilter异常处理无异常则跳过→ 传递到 DispatcherServlet → Controller核心业务关键特点顺序性过滤器按固定顺序执行可通过配置调整例如 “认证过滤器必须在授权过滤器前执行”中断性过滤器可中断链如认证失败直接返回 401不调用chain.doFilter()匹配性不同请求路径可匹配不同过滤器链如/login走表单登录链/api走 JWT 认证链。四、代码示例自定义过滤器链步骤 1自定义认证过滤器具体处理者实现 JWT 认证过滤器作为责任链的具体处理者java运行Component public class JwtAuthenticationFilter extends OncePerRequestFilter { Autowired private JwtTokenProvider jwtTokenProvider; Autowired private AuthenticationManager authenticationManager; Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 1. 提取 Token String token request.getHeader(Authorization); if (token null || !token.startsWith(Bearer )) { filterChain.doFilter(request, response); // 无 Token传递给下一个过滤器 return; } token token.substring(7); // 2. 校验 Token try { String username jwtTokenProvider.extractUsername(token); if (username ! null SecurityContextHolder.getContext().getAuthentication() null) { // 3. 认证通过存入 SecurityContext Authentication authentication jwtTokenProvider.getAuthentication(token); SecurityContextHolder.getContext().setAuthentication(authentication); System.out.println(JwtAuthenticationFilterJWT 认证通过用户 username); } } catch (Exception e) { // 认证失败中断链返回 401 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.getWriter().write(JWT 认证失败 e.getMessage()); return; } // 4. 传递给下一个过滤器 filterChain.doFilter(request, response); } }步骤 2配置过滤器链责任链管理器通过SecurityFilterChain构建自定义责任链指定过滤器顺序java运行Configuration EnableWebSecurity public class SecurityConfig { Autowired private JwtAuthenticationFilter jwtAuthenticationFilter; Autowired private CustomAccessDeniedHandler accessDeniedHandler; // 自定义授权失败处理器 Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 关闭默认的 CSRF测试环境生产需开启 .csrf(csrf - csrf.disable()) // 配置请求授权规则 .authorizeHttpRequests(auth - auth .requestMatchers(/login).permitAll() // 登录接口放行 .requestMatchers(/api/admin/**).hasRole(ADMIN) // 管理员接口需 ADMIN 角色 .anyRequest().authenticated() // 其他请求需认证 ) // 异常处理 .exceptionHandling(ex - ex .accessDeniedHandler(accessDeniedHandler) // 授权失败处理 .authenticationEntryPoint((request, response, authException) - { // 认证失败处理 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); response.getWriter().write(请先认证); }) ) // 添加自定义过滤器插入到 UsernamePasswordAuthenticationFilter 之后 .addFilterAfter(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); } // 认证管理器用于处理用户认证 Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); } // 密码编码器 Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }步骤 3核心业务Controller责任链终点java运行RestController RequestMapping(/api) public class UserController { GetMapping(/user) public String getUser() { return 普通用户接口; } GetMapping(/admin/user) public String getAdminUser() { return 管理员接口; } }五、核心过滤器内置具体处理者Spring Security 内置了数十个过滤器覆盖所有核心安全场景以下是最常用的过滤器核心职责执行顺序关键CsrfFilterCSRF 防护验证 CSRF Token靠前先防护后认证UsernamePasswordAuthenticationFilter表单登录认证处理/login请求的用户名密码认证类过滤器核心BasicAuthenticationFilterBasic 认证解析请求头中的Authorization: Basic xxx表单认证之后JwtAuthenticationFilterJWT 认证需自定义 / 引入 spring-security-oauth2可插入到认证过滤器链FilterSecurityInterceptor授权校验匹配PreAuthorize/ 角色 / 权限规则认证之后最后一个核心过滤器ExceptionTranslationFilter捕获安全异常如AuthenticationException/AccessDeniedException转换为 HTTP 响应授权过滤器之前LogoutFilter处理登出请求清理SecurityContext认证过滤器之前六、责任链的核心实现源码简化1. FilterChainProxy外层管理器java运行public class FilterChainProxy extends GenericFilterBean { private ListSecurityFilterChain filterChains; Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req (HttpServletRequest) request; HttpServletResponse res (HttpServletResponse) response; // 1. 匹配当前请求对应的 SecurityFilterChain SecurityFilterChain filterChain getMatchingFilterChain(req, res); if (filterChain null) { chain.doFilter(req, res); // 无匹配链直接传递 return; } // 2. 执行匹配到的过滤器链 VirtualFilterChain virtualFilterChain new VirtualFilterChain(chain, filterChain.getFilters()); virtualFilterChain.doFilter(req, res); } // 内部类封装具体过滤器链的执行 private static class VirtualFilterChain implements FilterChain { private final FilterChain originalChain; private final ListFilter filters; private int currentPosition 0; public VirtualFilterChain(FilterChain originalChain, ListFilter filters) { this.originalChain originalChain; this.filters filters; } Override public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { if (currentPosition filters.size()) { // 所有过滤器执行完成传递到原始链DispatcherServlet originalChain.doFilter(request, response); return; } // 按顺序执行下一个过滤器 currentPosition; Filter nextFilter filters.get(currentPosition - 1); nextFilter.doFilter(request, response, this); } } }2. 关键逻辑VirtualFilterChain是责任链的核心执行器通过currentPosition记录当前执行的过滤器索引每个过滤器执行完后调用virtualFilterChain.doFilter()实现请求的 “链式传递”所有过滤器执行完成后才会调用originalChain.doFilter()传递到 DispatcherServlet。七、Spring Security 责任链的核心特点1. 高度可定制顺序调整通过addFilterBefore()/addFilterAfter()/addFilterAt()调整过滤器顺序如将 JWT 过滤器插入到表单认证过滤器之后链的拆分多套SecurityFilterChain适配不同路径的安全规则如前台 / 后台不同认证方式过滤器扩展自定义过滤器只需继承OncePerRequestFilter注册到链中即可无需修改原有逻辑。2. 中断性与容错性中断链过滤器可通过 “不调用chain.doFilter()” 中断请求如认证失败直接返回 401异常处理ExceptionTranslationFilter捕获链中异常保证单一异常出口避免链中断导致的资源泄漏。3. 解耦性每个过滤器仅关注单一职责如认证、授权、CSRF符合 “单一职责原则”核心业务Controller无需耦合安全逻辑通过过滤器链透明增强。八、典型应用场景多认证方式同时支持表单登录、JWT 认证、OAuth2 认证不同过滤器处理精细化授权基于角色hasRole、权限hasPermission、IP 白名单的授权校验安全防护CSRF 防护、XSS 过滤、接口限流自定义过滤器实现异常统一处理认证 / 授权失败返回标准化 JSON 响应第三方集成集成 CAS、LDAP 等认证体系新增对应过滤器。九、与 Spring MVC 拦截器链的区别维度Spring Security 过滤器链Spring MVC HandlerInterceptor 链核心目的安全逻辑认证、授权、防护通用请求增强日志、参数处理执行时机DispatcherServlet 之前Servlet 容器层DispatcherServlet 内部扩展能力可拦截所有 Web 请求包括静态资源仅拦截 Controller 请求依赖原生 Servlet Filter无 Spring 依赖依赖 Spring 上下文可注入 Bean中断方式不调用chain.doFilter()preHandle返回 false总结Spring Security 是责任链模式在 “安全领域” 的极致落地核心载体FilterChainProxySecurityFilterChain构成双层责任链实现 “多规则匹配 顺序执行”核心逻辑每个过滤器是独立的安全处理单元通过chain.doFilter()传递请求支持中断和扩展核心价值将复杂的安全逻辑解耦为可插拔的过滤器适配不同场景的安全需求如单体应用、微服务、前后端分离扩展关键自定义过滤器只需继承OncePerRequestFilter通过addFilterBefore/After插入到责任链中无需修改框架源码。掌握这一机制是定制 Spring Security 安全规则如 JWT 认证、自定义授权的核心前提。