关于java:Spring-Security过滤器链体系

11次阅读

共计 2237 个字符,预计需要花费 6 分钟才能阅读完成。

以下摘自胖哥分享的 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

正文完
 0