当前位置: 首页 > 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.jsqmd.com/news/1037366/

相关文章:

  • 通化汽车维修行业盘点:避开用车维修误区,选靠谱门店更省心 - 百航
  • OpenCore Legacy Patcher完整指南:5步让旧Mac重获新生
  • Slidy包管理深度解析:高效管理Flutter依赖的最佳实践
  • Zod验证如何保障C.A.F.E.自动化的稳定性?深入解析项目架构
  • 烤肉桌定制厂家常见问题解答(2026最新专家版) - 热点速览
  • 超薄婴儿纸尿裤头部品牌推荐 10项维度解析 - 资讯速览
  • 新仲裁法实施百日,你的电子合同仲裁条款可能已经失效了
  • Aimless.js性能优化:如何在项目中高效使用JavaScript随机数生成
  • stock-scanner核心技术解析:多维度AI股票分析算法揭秘
  • PC无法读取SD卡并提示格式化的修复方法
  • 密云装修怎么选?本地家装避坑要点与靠谱整装标准解析 - 百航
  • 2026年投票制作平台怎么选 五家服务商横向对比供参考 - 深度智识库
  • 39钝刀工艺:让篆刻白文重现金石苍劲之美 - 资讯焦点
  • lidR包完整指南:如何用R语言轻松处理林业LiDAR数据
  • 2026 年南通工字钢批发厂家实测测评,工程采购避坑指南 - LYL仔仔
  • Retrospected AI教练功能详解:ChatGPT如何优化你的敏捷回顾流程
  • 打造极简登录界面:SilentSDDM配置文件编写实例与最佳实践
  • 光刻胶用氧杂蒽类、靛族类、二恶嗪类、三芳甲烷类染料(上)
  • pg_durable 5G应用:低延迟数据处理工作流的终极解决方案
  • 2026年6月座椅电梯厂家推荐 - 多才菠萝
  • 汕尾足不出户卖黄金,正规回收流程详解 - 余生黄金回收
  • 科学美育赋能成长!河源少儿美术培训机构甄选规范与优质机构推荐 - 资讯速览
  • ERPNext开源ERP深度指南:企业数字化转型的完整解决方案
  • YOLO实战排障指南:Ultralytics环境配置与训练避坑
  • Chili3D:浏览器中的工业级3D建模革命,告别传统CAD的云端设计新范式
  • Motorola DSP5685x平台TDC1驱动API深度解析与嵌入式音频开发实践
  • 人形机器人全身电子系统通信
  • 2026年6月重庆黄金回收测评:上门极速响应,报价透明无隐形加价 - 名奢变现站
  • Tailwind CSS Signals与其他Tailwind插件对比分析:终极指南
  • 2026沈阳名表回收行情怎么算?9641笔本地成交数据讲清估价逻辑 - 奢品小当家