以下摘自胖哥分享的 2022动工福利教程。

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

  • Spring Security的登录是怎么配置的?
  • Spring Security的访问控制是什么机制?

SpringBootWebSecurityConfiguration

下面两个疑难的答案就在配置类SpringBootWebSecurityConfiguration中。你能够依照上面这个思维导图去了解这个主动配置:

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

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

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

SecurityFilterChain

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

public interface SecurityFilterChain {   //  以后申请是否匹配    boolean matches(HttpServletRequest request);    // 一揽子过滤器组成的有序过滤器链    List<Filter> getFilters();}

当一个申请HttpServletRequest进入SecurityFilterChain时,会通过matches办法来确定是否满足条件进入过滤器链。就好比你是VIP走的是VIP通道,享受的是VIP的一系列待遇;你是普通用户,就走普通用户的通道并享受普通用户的待遇。

不论用户是哪种角色,都走的是一个过滤器链,一个利用中存在1-nSecurityFilterChain。那谁来治理多个SecurityFilterChain呢?

记住这个公式HttpSecurity ->SecurityFilterChain

FilterChainProxy

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

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

依据不同的申请门路匹配走不同的SecurityFilterChain。上面是示意图:

前面还会对接触这个类,当初你只须要明确下面这个图就行了。

请留神:在同一过滤器链中不倡议有多个FilterChainProxy实例,而且不应将其作为单纯的过滤器应用,它只应该承当治理SecurityFilterChain的性能。

DelegatingFilterProxy

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

简略总结

下面的三个概念十分重要,波及到Spring Security的整个过滤器链体系。然而作为初学者来说,能看懂多少就看懂多少,不要纠结哪些没有了解,因为目前学习阶段的档次达不到是十分失常的。然而等你学完了Spring Security之后,这几个概念肯定要搞明确。

关注公众号:Felordcn 获取更多资讯

集体博客:https://felord.cn