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

security第九集 自定义过滤器

Spring Security中的过滤器架构是基于Servlet构建的,因此,下面先回顾Servlet中的过滤器。

publicinterfaceFilter{defaultvoidinit(FilterConfigfilterConfig)throwsServletException{}voiddoFilter(ServletRequestvar1,ServletResponsevar2,FilterChainvar3)throwsIOException,ServletException;defaultvoiddestroy(){}}

当应用程序启动时,Servlet容器会调用init()方法。该方法只会调用一次,所以该方法中应该包含初始化该过滤器的相关代码。对应地,destroy()方法用于释放该过滤器所占有的资源。
一个过滤器组件所包含的业务逻辑应该位于doFilter()方法中,该方法带有三个参数,分别是ServletRequest、ServletResponse和FilterChain。这三个参数都很重要,具体说明如下。

  • ServletRequest:表示HTTP请求,使用该对象获取与请求相关的详细信息。
  • ServletResponse:表示HTTP 响应,使用该对象构建响应结果,然后将其发送回客户端或沿着过滤器链向后传递。
  • FilterChain:表示过滤器链,使用该对象将请求转发到过滤器链中的下一个过滤器。

下面我们基于servlet过滤器,编写 Spring Security 中的自定义过滤器,来实现如下功能:

  1. 在请求中,要检验header中 是否存在 flag 标志
  2. 存在就进行下一步用户认证
  3. 不存在就返回错误码
  4. 在用户认证成功后用日志打印出flag的值。

首先我们创建第一个过滤器 RequestCheckerFilter 来实现 前三个步骤

importcom.alibaba.druid.util.StringUtils;importjavax.servlet.*;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;publicclassRequestCheckerFilterimplementsFilter{@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{Filter.super.init(filterConfig);}@Overridepublicvoiddestroy(){Filter.super.destroy();}@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{HttpServletRequesthttpServletRequest=(HttpServletRequest)servletRequest;HttpServletResponsehttpServletResponse=(HttpServletResponse)servletResponse;//从header中获取flag的值Stringflag=httpServletRequest.getHeader("flag");//判断flag的值 是否存在if(StringUtils.isEmpty(flag)){//随便返回一个错误码httpServletResponse.setStatus(HttpServletResponse.SC_BAD_GATEWAY);return;}//将请求转发到过滤器链中的下一个过滤器filterChain.doFilter(servletRequest,servletResponse);}}

接下来创建第二个过滤器LoggingFilter,来实现打印flag的值

importjavax.servlet.*;importjavax.servlet.http.HttpServletRequest;importjava.io.IOException;importjava.util.logging.Logger;publicclassLoggingFilterimplementsFilter{privatefinalLoggerlogger=Logger.getLogger(LoggingFilter.class.getName());@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{Filter.super.init(filterConfig);}@Overridepublicvoiddestroy(){Filter.super.destroy();}@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{HttpServletRequesthttpServletRequest=(HttpServletRequest)servletRequest;//从ServletRequest获取请求数据并记录Stringflag=httpServletRequest.getHeader("flag");logger.info("Authtication for:"+flag);//将请求在过滤器链上继续传递filterChain.doFilter(servletRequest,servletResponse);}}

定义好两个过滤器之后,怎么将它们整合到Spring Security的过滤器链中,并且设置过滤器的顺序。
首先我们要知道实现HTTP基础认证机制的过滤器是 BasicAuthenticationFilter,
那么最合理的顺序就是

  1. 认证前检验flag标志,来排除一批无效请求
  2. 认证
  3. 认证成功后打印flag标志

所以基于上面的思考做如下配置

importcom.kai.oauth.securityservice.filter.LoggingFilter;importcom.kai.oauth.securityservice.filter.RequestCheckerFilter;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;importorg.springframework.security.core.userdetails.User;importorg.springframework.security.core.userdetails.UserDetails;importorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;importorg.springframework.security.web.authentication.www.BasicAuthenticationFilter;/** * <p></p> * * @author wangkai * @date 2024-12-10 16:32 */@ConfigurationpublicclassMyWebSecurityConfigAdapterextendsWebSecurityConfigurerAdapter{@Overrideprotectedvoidconfigure(AuthenticationManagerBuilderauth)throwsException{UserDetailsuser=User.withUsername("user").password("{noop}123456").roles("USER").build();auth.inMemoryAuthentication().withUser(user);UserDetailsadmin=User.withUsername("admin").password("{noop}123456").roles("ADMIN").build();auth.inMemoryAuthentication().withUser(admin);}@Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{http.httpBasic();http.addFilterBefore(newRequestCheckerFilter(),BasicAuthenticationFilter.class).addFilterAfter(newLoggingFilter(),BasicAuthenticationFilter.class).authorizeRequests().anyRequest().authenticated();}}

可以看到,配置中用了两个方法 addFilterBefore(在之前) 和 addFilterAfter(在之后) 来调整过滤器的顺序。

接下来 用postman测试一下,先测试一个提供用户信息,但header中没有flag标志的

看status ,是 502 Bad Gateway,这正是在 RequestCheckerFilter中定义的 状态码 HttpServletResponse.SC_BAD_GATEWAY。

现在在请求头header中加上 flag 试试

观察控制台,当用户信息正确的时候 ,的确输出了 flag的日志

到此,自定义的过滤器配置已经成功了,下面列举一些 Spring Security中的一些常见过滤器

  • ChannelProcessingFilter 可根据配置进行协议的重定向
  • SecurityContextPersistenceFilter
    针对每个Web请求,在结束时将SecurityContext保存到HttpSession中
  • ConcurrentSessionFilter 刷新Session的最后更新时间并判断Session是否过期
  • UsernamePasswordAuthenticationFilter、CasAuthenticationFilter、BasicAuthenticationFilter等
    Spring Security内置的一组认证过滤器
  • SecurityContextHolderAwareRequestFilter 安全上下文控制过滤器
  • JaasApiIntegrationFilter Jaas相关过滤器
  • RememberMeAuthenticationFilter 提供“Remember Me”功能的过滤器
  • AnonymousAuthenticationFilter 匿名授权过滤器
  • ExceptionTranslationFilter 异常捕获和处理过滤器
  • FilterSecurityInterceptor 权限控制过滤器
http://www.gsyq.cn/news/1549266.html

相关文章:

  • 超薄婴儿纸尿裤头部品牌推荐 10项维度解析 - 资讯速览
  • Slidy包管理深度解析:高效管理Flutter依赖的最佳实践
  • Aimless.js性能优化:如何在项目中高效使用JavaScript随机数生成
  • stock-scanner核心技术解析:多维度AI股票分析算法揭秘
  • 打造极简登录界面:SilentSDDM配置文件编写实例与最佳实践
  • 光刻胶用氧杂蒽类、靛族类、二恶嗪类、三芳甲烷类染料(上)
  • 2026年6月座椅电梯厂家推荐 - 多才菠萝
  • YOLO实战排障指南:Ultralytics环境配置与训练避坑
  • pg_durable 5G应用:低延迟数据处理工作流的终极解决方案
  • 科学美育赋能成长!河源少儿美术培训机构甄选规范与优质机构推荐 - 资讯速览
  • Chili3D:浏览器中的工业级3D建模革命,告别传统CAD的云端设计新范式
  • ERPNext开源ERP深度指南:企业数字化转型的完整解决方案
  • 2026年6月重庆黄金回收测评:上门极速响应,报价透明无隐形加价 - 名奢变现站
  • GATTacker MAC地址克隆技术:终极蓝牙设备伪装指南
  • 2026年暑期腾讯AI Agent实习面试题
  • 计算机Django毕设实战-基于 Django+Vue 的农田信息智能管理系统的设计与实现 基于 Django+Vue 的农作物种植管理系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 如何用Aimless.js提升Web开发体验:表单验证、UI效果等10个实用场景
  • 岳阳全域黄金上门回收,资质齐全交易有保障 - 余生黄金回收
  • TurretCSS性能优化指南:构建轻量级响应式网站的秘诀
  • 解决PDF目录丢失难题:pdf.tocgen与Emacs toc-mode的无缝集成方案
  • 关键词密度到语义理解:工具底层逻辑之变 - 资讯焦点
  • 2026成都黄金回收避坑首选:收的顶合规门店无损检测实测 - 奢侈品回收评测
  • Bootleg自监督学习技术:隐藏层自蒸馏解析
  • 希音退货需要卖家承担吗?妙手ERP上线SHEIN全托管备货管理功能,搞定卖家退货全流程! - 跨境小媛
  • 【物联网】Zigbee设备协议转换的完整实现方案
  • 通义实验室推出首个统一“科学语法”的多领域科学生成基础模型 LOGOS
  • Python+Pytest构建支付风控自动化测试框架:从数据工厂到全链路验证
  • 如何用Win11Debloat彻底优化Windows 11:免费开源系统瘦身工具完整指南
  • ghostty-cursor-shaders:为终端打造惊艳光标动画的终极指南
  • Claude Code Action:让你的GitHub工作流拥有AI大脑的3个实用场景