干货福利PDF下载|Spring Security过滤器链体系

举报
码农小胖哥 发表于 2022/04/01 00:01:09 2022/04/01
【摘要】 2022年的开工福利已经发布,希望同学们多宣传推广一下,造福其他同学,当然点赞、再看也不能少哦。  在学习Spring Security的时候你有没有下面这两个疑问: Spring Security的登录是怎么配置的?Spring Security的访问控制是什么机制? SpringBootWebSecur...

63851a9ad5058bf4d445ef4ea59aa9d9.gif

2022年的开工福利已经发布,希望同学们多宣传推广一下,造福其他同学,当然点赞、再看也不能少哦。 

787c4b33260fc96f1b12dab8d1e38e37.png

在学习Spring Security的时候你有没有下面这两个疑问:

  • Spring Security的登录是怎么配置的?

  • Spring Security的访问控制是什么机制?

SpringBootWebSecurityConfiguration

上面两个疑问的答案就在配置类SpringBootWebSecurityConfiguration中。你可以按照下面这个思维导图去理解这个自动配置:bb0272b97cadbc8035555c572b6f3b0e.png

SpringBootWebSecurityConfigurationSpring Boot应用提供了一套默认的Spring Security配置。


   
  1. @Bean
  2.  @Order(SecurityProperties.BASIC_AUTH_ORDER)
  3.  SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
  4.   http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
  5.   return http.build();
  6.  }

这里的配置为:所有的请求都必须是认证用户发起的,同时开启表单登录功能以及Http Basic Authentication认证功能。我们访问/foo/bar时需要登录认证并且能够进行表单登录就是这个配置起作用了。这个是我们日常开发需要自定义的,在HttpSecurity相关的文章中胖哥也进行了讲解。这个SecurityFilterChain到底是什么呢?

SecurityFilterChain

从上面看得出HttpSecurity就是一个构建类,它的使命就是构建出一个SecurityFilterChain


   
  1. public interface SecurityFilterChain {
  2.    //  当前请求是否匹配
  3.  boolean matches(HttpServletRequest request);
  4.     // 一揽子过滤器组成的有序过滤器链
  5.  List<Filter> getFilters();
  6. }

当一个请求HttpServletRequest进入SecurityFilterChain时,会通过matches方法来确定是否满足条件进入过滤器链。就好比你是VIP走的是VIP通道,享受的是VIP的一系列待遇;你是普通用户,就走普通用户的通道并享受普通用户的待遇。167645d781e666ff18a6443ea6bcb1b3.png不管用户是哪种角色,都走的是一个过滤器链,一个应用中存在1-nSecurityFilterChain。那谁来管理多个SecurityFilterChain呢?

记住这个公式HttpSecurity ->SecurityFilterChain

FilterChainProxy

FilterChainProxy是一个GenericFilterBean(即使Servlet Filter又是Spring Bean),它管理了所有注入Spring IoC容器的SecurityFilterChain。在我刚接触Spring Security的时候是这样配置FilterChainProxy的:


   
  1. <bean id="myfilterChainProxy" class="org.springframework.security.web.FilterChainProxy">
  2.         <constructor-arg>
  3.             <util:list>
  4.                 <security:filter-chain pattern="/do/not/filter*" filters="none"/>
  5.                 <security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/>
  6.             </util:list>
  7.         </constructor-arg>
  8.     </bean>

根据不同的请求路径匹配走不同的SecurityFilterChain。下面是示意图:eb5af7ee5b9576180943d50a6a73e91c.png后面还会对遇到这个类,现在你只需要明白上面这个图就行了。

请注意:在同一过滤器链中不建议有多个FilterChainProxy实例,而且不应将其作为单纯的过滤器使用,它只应该承担管理SecurityFilterChain的功能。

DelegatingFilterProxy

Servlet 容器和Spring IoC容器之间的Filter生命周期并不匹配。为了让Spring IoC容器管理Filter的生命周期,FilterChainProxy便交由Spring Web下的DelegatingFilterProxy来代理。而且FilterChainProxy不会在添加到应用程序上下文的任何过滤器Bean上调用标准Servlet过滤器生命周期方法,FilterChainProxy的生命周期方法会委托给DelegatingFilterProxy来执行。而DelegatingFilterProxy作为Spring IoCServlet的连接器存在。69f2ff67b4e3867a586c7402452ff201.png

简单总结

上面的三个概念非常重要,涉及到Spring Security的整个过滤器链体系。但是作为初学者来说,能看懂多少就看懂多少,不要纠结哪些没有理解,因为目前学习阶段的层次达不到是非常正常的。但是等你学完了Spring Security之后,这几个概念一定要搞明白。

程序员必备的工具集,简直就是一把瑞士军刀

2022-02-09

cf775a7a9277fc285f4b502cd63238d3.png

开工福利|2022年原创Spring Security干货教程PDF来了

2022-02-08

d069e945fa42fc599e44b8ee3bcc0715.png

欢迎加入胖哥技术内卷群

2022-02-09

841cc4266772ec735cb73ce01992a829.png

291abde1af924b5dd9a2c2c06c59d2c6.gif

文章来源: felord.blog.csdn.net,作者:码农小胖哥,版权归原作者所有,如需转载,请联系作者。

原文链接:felord.blog.csdn.net/article/details/122872161

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。