spring security filter源码分析

本文详细解析了Spring Security中Filter的排序机制,包括如何通过SecurityFilters枚举定义默认Filter顺序,使用OrderDecorator维持Filter与顺序的关系,以及OrderComparator进行排序的过程。

通过前面Spring Security提供的各种Filter的分析,大体上知道每个Filter具体的用途了。 

Spring Security一共提供了20个Filter,我目前只分析了13个(如果http的auto-config="true",那默认的filter列表都包含在这13个里面了),另外7个在后面的源码分析中碰到时会逐个讲解。 在分析http标签时,已经提到filter排序的问题了,但是没有深入。 

现在再回头看filter是如何排序的。下面的代码片段截取自HttpSecurityBeanDefinitionParser类, 
Java代码  收藏代码
  1. //定义未排序filter集合。该集合中的对象为OrderDecorator实例。  
  2. List<OrderDecorator> unorderedFilterChain = new ArrayList<OrderDecorator>();  
  3. //添加http、认证相关的filter集合  
  4. unorderedFilterChain.addAll(httpBldr.getFilters());  
  5. unorderedFilterChain.addAll(authBldr.getFilters());  
  6. //定义RequestCacheAwareFilter过滤器,并添加到unorderedFilterChain中  
  7. BeanDefinition requestCacheAwareFilter = new RootBeanDefinition(RequestCacheAwareFilter.class);  
  8. requestCacheAwareFilter.getPropertyValues().addPropertyValue("requestCache", authBldr.getRequestCache());  
  9. unorderedFilterChain.add(new OrderDecorator(requestCacheAwareFilter, REQUEST_CACHE_FILTER));  
  10. //添加自定义filter  
  11. unorderedFilterChain.addAll(buildCustomFilterList(element, pc));  
  12. //根据排序规则进行排序  
  13. Collections.sort(unorderedFilterChain, new OrderComparator());  
  14. //检查每个filter与前一个filter的位置是否相同  
  15.  //这里的检查主要是防止自定义filter直接配置position属性,造成与默认的filter产生order冲突  
  16. checkFilterChainOrder(unorderedFilterChain, pc, source);  
  17. //重新定义filterChain,把经过排序的filter依次添加到filterChain集合中  
  18. List<BeanMetadataElement> filterChain = new ManagedList<BeanMetadataElement>();  
  19.   
  20. for (OrderDecorator od : unorderedFilterChain) {  
  21.     filterChain.add(od.bean);  
  22. }  

细心的同学会发现httpBldr.getFilters()、authBldr.getFilters()两个方法返回的就是OrderDecorator对象的集合列表。并且OrderDecorator对象已经将filter与SecurityFilters中的order关联了起来 
Java代码  收藏代码
  1. unorderedFilterChain.addAll(httpBldr.getFilters());  
  2. unorderedFilterChain.addAll(authBldr.getFilters());  

顺便看一下创建自定义过滤器部分 
Java代码  收藏代码
  1. List<OrderDecorator> buildCustomFilterList(Element element, ParserContext pc) {  
  2.     List<Element> customFilterElts = DomUtils.getChildElementsByTagName(element, Elements.CUSTOM_FILTER);  
  3.     List<OrderDecorator> customFilters = new ArrayList<OrderDecorator>();  
  4.   
  5.     final String ATT_AFTER = "after";  
  6.     final String ATT_BEFORE = "before";  
  7.     final String ATT_POSITION = "position";  
  8.     //循环自定义标签列表custom-filter  
  9.     for (Element elt: customFilterElts) {  
  10.         String after = elt.getAttribute(ATT_AFTER);  
  11.         String before = elt.getAttribute(ATT_BEFORE);  
  12.         String position = elt.getAttribute(ATT_POSITION);  
  13.   
  14.         String ref = elt.getAttribute(ATT_REF);  
  15.   
  16.         if (!StringUtils.hasText(ref)) {  
  17.             pc.getReaderContext().error("The '" + ATT_REF + "' attribute must be supplied", pc.extractSource(elt));  
  18.         }  
  19.   
  20.         RuntimeBeanReference bean = new RuntimeBeanReference(ref);  
  21.   
  22.         if(WebConfigUtils.countNonEmpty(new String[] {after, before, position}) != 1) {  
  23.             pc.getReaderContext().error("A single '" + ATT_AFTER + "', '" + ATT_BEFORE + "', or '" +  
  24.                     ATT_POSITION + "' attribute must be supplied", pc.extractSource(elt));  
  25.         }  
  26.         //如果指定了position,直接将filter与order产生关联关系  
  27.         if (StringUtils.hasText(position)) {  
  28.             customFilters.add(new OrderDecorator(bean, SecurityFilters.valueOf(position)));  
  29.         //如果指定了after,将filter与after值加一产生关联关系  
  30.         } else if (StringUtils.hasText(after)) {  
  31.             SecurityFilters order = SecurityFilters.valueOf(after);  
  32.             if (order == SecurityFilters.LAST) {  
  33.                 customFilters.add(new OrderDecorator(bean, SecurityFilters.LAST));  
  34.             } else {  
  35.                 customFilters.add(new OrderDecorator(bean, order.getOrder() + 1));  
  36.             }  
  37.         //如果指定了before,将filter与before-1产生关联关系  
  38.         } else if (StringUtils.hasText(before)) {  
  39.             SecurityFilters order = SecurityFilters.valueOf(before);  
  40.             if (order == SecurityFilters.FIRST) {  
  41.                 customFilters.add(new OrderDecorator(bean, SecurityFilters.FIRST));  
  42.             } else {  
  43.                 customFilters.add(new OrderDecorator(bean, order.getOrder() - 1));  
  44.             }  
  45.         }  
  46.     }  
  47.   
  48.     return customFilters;  
  49. }  

这里用到三个重要的与排序相关的类及枚举,分别是OrderDecorator、OrderComparator以及SecurityFilters枚举 
首先看SecurityFilters枚举定义 
Java代码  收藏代码
  1. enum SecurityFilters {  
  2.     FIRST (Integer.MIN_VALUE),  
  3.     //order=100  
  4.     CHANNEL_FILTER,  
  5.     //order=200  
  6.     CONCURRENT_SESSION_FILTER,  
  7.     //依次递增……  
  8.     SECURITY_CONTEXT_FILTER,  
  9.     LOGOUT_FILTER,  
  10.     X509_FILTER,  
  11.     PRE_AUTH_FILTER,  
  12.     CAS_FILTER,  
  13.     FORM_LOGIN_FILTER,  
  14.     OPENID_FILTER,  
  15.     LOGIN_PAGE_FILTER,  
  16.     DIGEST_AUTH_FILTER,  
  17.     BASIC_AUTH_FILTER,  
  18.     REQUEST_CACHE_FILTER,  
  19.     SERVLET_API_SUPPORT_FILTER,  
  20.     REMEMBER_ME_FILTER,  
  21.     ANONYMOUS_FILTER,  
  22.     SESSION_MANAGEMENT_FILTER,  
  23.     EXCEPTION_TRANSLATION_FILTER,  
  24.     FILTER_SECURITY_INTERCEPTOR,  
  25.     SWITCH_USER_FILTER,  
  26.     LAST (Integer.MAX_VALUE);  
  27.     //这里设置100,主要给自定义过滤器提供after、before的预留位置  
  28.     //也就是说,在某个默认的过滤器前后只能自定义99个过滤器,虽然可能性几乎为0  
  29.     private static final int INTERVAL = 100;  
  30.     private final int order;  
  31.     //返回的order值=序号*间隔100  
  32.     private SecurityFilters() {  
  33.         order = ordinal() * INTERVAL;  
  34.     }  
  35.   
  36.     private SecurityFilters(int order) {  
  37.         this.order = order;  
  38.     }  
  39.     //主要通过该方法返回Filter的位置  
  40.     public int getOrder() {  
  41.        return order;  
  42.     }  
  43. }  

由此可见,该类维护了Spring Security中每个filter的顺序 
接着看OrderDecorator类。这个类实现org.springframework.core.Ordered接口 
Java代码  收藏代码
  1. class OrderDecorator implements Ordered {  
  2.     BeanMetadataElement bean;  
  3.     int order;  
  4.     //构造函数传递两个参数1.bean定义;2.filter在链中的位置  
  5.     public OrderDecorator(BeanMetadataElement bean, SecurityFilters filterOrder) {  
  6.         this.bean = bean;  
  7.         this.order = filterOrder.getOrder();  
  8.     }  
  9.   
  10.     public OrderDecorator(BeanMetadataElement bean, int order) {  
  11.         this.bean = bean;  
  12.         this.order = order;  
  13.     }  
  14.     //实现接口方法getOrder  
  15.     public int getOrder() {  
  16.         return order;  
  17.     }  
  18.   
  19.     public String toString() {  
  20.         return bean + ", order = " + order;  
  21.     }  
  22. }  

OrderComparator类的路径是org.springframework.core.OrderComparator,实际上是spring core包的一个比较器,可以顺便看下OrderComparator源码。下面截取的只是部分核心代码 
Java代码  收藏代码
  1. public int compare(Object o1, Object o2) {  
  2.     boolean p1 = (o1 instanceof PriorityOrdered);  
  3.     boolean p2 = (o2 instanceof PriorityOrdered);  
  4.     if (p1 && !p2) {  
  5.         return -1;  
  6.     }  
  7.     else if (p2 && !p1) {  
  8.         return 1;  
  9.     }  
  10.     //前面几行代码主要针对PriorityOrdered,这里不做分析  
  11.   
  12.                      //分别获取Ordered接口实现类的getOrder方法得到order值  
  13.     int i1 = getOrder(o1);  
  14.     int i2 = getOrder(o2);  
  15.                   //对得到的order进行比较  
  16.     return (i1 < i2) ? -1 : (i1 > i2) ? 1 : 0;  
  17. }  
  18.          //获取Ordered接口的实现类,获取getOrder值  
  19. protected int getOrder(Object obj) {  
  20.     return (obj instanceof Ordered ? ((Ordered) obj).getOrder() : Ordered.LOWEST_PRECEDENCE);  
  21. }  

通过以上的分析,可以总结如下 
1.由SecurityFilters维持位置order 
2.由OrderDecorator维持filter与order的对应关系 
3.由OrderComparator负责比较OrderDecorator的先后顺序 

附上默认的过滤器顺序列表 
order过滤器名称
100ChannelProcessingFilter
200ConcurrentSessionFilter
300SecurityContextPersistenceFilter
400LogoutFilter
500X509AuthenticationFilter
600RequestHeaderAuthenticationFilter
700CasAuthenticationFilter
800UsernamePasswordAuthenticationFilter
900OpenIDAuthenticationFilter
1000DefaultLoginPageGeneratingFilter
1100DigestAuthenticationFilter
1200BasicAuthenticationFilter
1300RequestCacheAwareFilter
1400SecurityContextHolderAwareRequestFilter
1500RememberMeAuthenticationFilter
1600AnonymousAuthenticationFilter
1700SessionManagementFilter
1800ExceptionTranslationFilter
1900FilterSecurityInterceptor
2000SwitchUserFilter

以上标注红色的都已经分析完毕
内容概要:本文研究了基于有限控制集模型预测控制(FCS-MPC)的三相并网逆变器双模态调控策略,深入探讨了电流与功率双模式预测控制之间的等效机理及其性能边界。通过Simulink仿真平台与Matlab编程实现,构建了一个融合电流预测和功率预测的闭环控制系统,旨在提升逆变器在复杂电网环境下的动态响应能力、电能质量和并网稳定性。文章系统阐述了FCS-MPC的基本原理及其在三相并网系统中的应用,提出了一种兼顾稳态精度与动态抗扰性的双模态控制架构,并通过多工况仿真验证了该策略在抑制电流畸变、实现功率无差拍响应等方面的优越性能,揭示了其在高渗透率新能源系统中稳定并网的应用潜力。; 适合人群:具备一定电力电子与自动控制理论基础,从事新能源发电、微电网控制、电力系统仿真等相关领域的科研人员及工程技术人员,尤其适合研究生及以上学历或工作1-3年的研发人员; 使用场景及目标:①用于研究三相并网逆变器在电网不平衡、电压波动等非理想条件下的高性能控制策略;②为实现高渗透率新能源系统的稳定并网提供技术参考与仿真验证手段;③支持学术论文复现、课题研究及工程项目前期技术探索; 阅读建议:建议结合提供的Simulink模型与Matlab代码进行同步仿真操作,深入理解双模态预测控制的设计逻辑与参数整定方法,重点关注不同工况下的系统响应特性,以掌握其在实际应用中的优势与局限性。
内容概要:本文聚焦电网故障下分布式能源系统的多目标无功优化问题,以并网转换器(GCC)为核心,提出并实现了基于Matlab/Simulink的高性能控制策略仿真方案。研究采用有源中点箝位(ANPC)三电平逆变器拓扑,结合双极性倍频脉宽调制(DPWMA)、正负序分离锁相环与电网电压前馈控制,构建一体化控制体系,旨在提升系统在电网电压不平衡、对称跌落及动态扰动等复杂工况下的并网电能质量、动态响应速度与运行稳定性。通过多场景仿真验证,该方案能有效抑制谐波、稳定中点电位、实现对称并网电流与平滑功率输出,尤其在电网不平衡和动态切换条件下展现出卓越的抗扰能力和快速恢复特性,为高比例新能源并网提供了可靠的技术路径。; 适合人群:具备电力电子、自动控制或新能源并网等相关专业背景,从事电力系统仿真研究、攻读硕士及以上学位或从事新能源并网技术研发的工程技术人员。; 使用场景及目标:①深入研究高比例新能源接入背景下并网逆变器在电网故障时的无功支撑与稳定控制机制;②掌握ANPC三电平拓扑与先进调制、锁相、前馈控制技术的协同设计方法;③通过Matlab/Simulink搭建复杂电力系统仿真模型,服务于科研项目开发、高水平论文复现或工程化方案验证。; 阅读建议:建议结合文中提供的完整仿真资源与参考文献,按照目录结构系统学习,重点关注控制策略的设计原理、模块实现细节与仿真结果对比分析,动手实践仿真模型以深入理解各子系统间的耦合关系及整体性能表现。
内容概要:本文针对高渗透率电动汽车随机充电行为对配电网承载能力的影响开展系统性研究,深入分析了大规模电动汽车无序接入导致的配电网脆弱性问题,构建了涵盖电动汽车充电负荷、分布式电源及电网运行约束的综合仿真模型,并基于Matlab平台进行多场景仿真。研究采用多维度指标体系评估不同渗透率下配电网的安全性、电能质量和运行效率,结合熵权法与模糊综合评价方法实现承载能力的量化评分,进一步提出广义需求响应协同优化策略,通过引导用户充电行为以缓解负荷压力、改善系统性能,提升配电网韧性与适应性。研究成果为高比例电动汽车接入背景下的电网规划、运行调控及基础设施建设提供了理论支撑与决策依据。; 适合人群:具备电力系统、电气工程或相关领域专业知识,熟悉Matlab仿真环境,从事新能源并网、智能配电网优化、电动汽车与电网互动(V2G)、需求响应等领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①评估高比例电动汽车接入对配电网电压偏差、线路负载率、变压器容量等关键设备运行状态的影响;②设计并验证广义需求响应策略在平抑负荷波动、降低网损、提升电能质量与系统承载能力方面的有效性;③为新型电力系统中充电设施规划、有序充电管理及电网升级改造提供科学依据和技术支持。; 阅读建议:建议结合文中提供的Matlab代码进行仿真实践,重点关注电动汽车充电模型的随机性建模、多指标评价体系的构建逻辑以及需求响应优化机制的实现过程,可进一步拓展至V2G双向互动、可再生能源协同调度等应用场景进行深化研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值