spring-security
在使用spring-security时,我们应该去思考一些问题:
客户端发起请求到最终的servlet可能会经过如下过程:
我们可以思考一下,权限认证是不是也是其中某一个或者某几个filter呢?
DelegatingFilterProxy并不是SpringSecurity提供,而是Spring框架本身就存在的。它继承自GenericFilterBean,Servlet容器在启动的时候就会执行GenericFilterBean的init方法。
我们看看子类DelegatingFilterProxy的initFilterBean()方法里面做了什么事
在debug模式下我们可以看到真实的具体信息
通过上面源码的解析我们能够发现DelegatingFilterProxy这个过滤器在初始的时候从Spring容器中获取了 FilterChainProxy 这个过滤器链的代理对象,并且把这个对象保存在了DelegatingFilterProxy 的delegate属性中。那么当请求到来的时候会执行DelegatingFilterProxy的doFilter方法,那么我们就可以来看下这个方法里面又执行了什么
实际流程变为:
我们需要了解的概念,SpringSecurity中可以存在多个过滤器链,而每个过滤器链又可以包含多个过滤器
SpringSecurity中的主要过滤器
先前我们讲到,会构造出一个虚拟链路执行对应的filter。 VirtualFilterChain
decide方法在做投票选举,第一次的时候回抛出AccessDeniedException异常,而抛出的异常会
被ExceptionTranslationFilter中的catch语句块捕获,进而执行handleSpringSecurityException方法。
基于SpringBoot的自动装配,第三方框架要加载的信息在spring.factories中
这三个类中与DelegatingFilterProxy有关系的是SecurityFilterAutoConfiguration
我们来看一下这里面的构建逻辑是如何处理的
从ServletContextInitializer.onStartU()开始分析
至此,我们可以看到在springboot中,通过DelegatingFilterProxyRegistrationBean创建了一个,DelegatingFilterProxy过滤器并且执行了拦截地址是 /*。后续的流程就和xml流程一致,通过FilterChainProxy处理。