SpringSecurity大致流程记录
Spring Bean 管理
一、容器的生成,Bean的扫描
1、ApplicationContext 会扫描配置,将所有的Bean扫描出来
所有Bean 的相关信息都保存在BeanDefinition中
- BeanFactory ApplicationContext 都能够理解为容器
- BeanFactory 负责创建和获取Bean
- ApplicationContext 功能更全面 解析配置类 注册BeanDefinition
2、初始化前的处理
- @PostContruct 标注方法
- 实现接口InitializingBean
- xml 配置 init method
二、Filter and sprng Security
1、请求从发起到响应的过程;当一个请求到达Servlet Container(通常是Tomcat),容器会开始构造HttpServletRequest和HttpServletResponse对象,同时也会创建FilterChain对象,把HttpServletRequest和HttpServletResponse交由FilterChain进行处理。在这个过程中:
- 所有Filter按照注册的顺序进行调用
- 任一Filter可以根据实际情况决定终止调用链(调用HttpServletResposne返回),或继续传递到下游的Filter
- 当一个请求经过了所有的Filter,最终会抵达Servlet中
2、SecurityFilterChain:Spring Security的核心也是FilterChain模式,只不过在Spring Security中,它维护了一套自己的FilterChain,叫SecurityFilterChain
在Spring Security的应用程序中,会存在2套FilterChain,分别是Servlet FilterChain和Spring SecurityFilterChain。事实上两者没有本质上的区别,甚至它们Filter的接口都是javax.servlet
下的Filter。SecurityFilterChain对应的特性:
-
和Servlet Container解耦:Spring Web Mvc底层容器是Servlet Container,而Spring Security是构建在Spring Web Mvc中的一套框架,本质上这两套是不同的体系。拆分出SecurityFilterChain逻辑上更加清晰,和底层容器的耦合也会降低。这个逻辑就跟Spring Web Mvc用一个DispatcherServlet接收所有请求再分发到Controller的思想是有点类似的。
-
解耦Servlet Container 和 Spring IoC Container
Spring Security对Spring框架是强依赖关系,其中大量使用了Spring Bean。对于Servlet Filter而言,本不能感知到Spring Bean。而SecurityFilterChain中的Filter,可以在上下文轻易注入Spring Bean。
3、DelegatingFilterProxy:DelegatingFilterProxy
主要的作用是桥接Spring IoC Container和Servlet Container。在上面小节提到Servlet Filter无法感知Spring Bean,而DelegatingFilterProxy
可以实现这一功能。
4、FilterChainProxy
是一个特殊的Filter。在默认情况下,它会被注册到Spring IoC Container中,beanName为springSecurityFilterChain
,同时它会被DelegatingFilterProxy持有(从Spring容器中取出),且DelegatingFilterProxy会把自己注册到ServletFilter中。
5、Security Filters
是Spring Security设计的Filter,它和ServletFilter没有本质上的不同。只不过它单独应用于SecurityFilterChain上,这些Filter会被FilterChainProxy加载,构造出VitrualFilterChain进行过滤。下面是Spring Security内置的一些Security Filters。
- ChannelProcessingFilter
- WebAsyncManagerIntegrationFilter
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- CorsFilter
- CsrfFilter
- LogoutFilter
- OAuth2AuthorizationRequestRedirectFilter
- Saml2WebSsoAuthenticationRequestFilter
- X509AuthenticationFilter
- AbstractPreAuthenticatedProcessingFilter
- CasAuthenticationFilter
- OAuth2LoginAuthenticationFilter
- Saml2WebSsoAuthenticationFilter
- UsernamePasswordAuthenticationFile
- 作用:用于处理基于用户名和密码的身份验证。
- 当用户提交用户名和密码时,该过滤器拦截请求并尝试进行身份验证。如果认证成功,将生成一个认证成功的
Authentication
对象。
- OpenIDAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- ConcurrentSessionFilter
- DigestAuthenticationFilter
- BearerTokenAuthenticationFilter
- BasicAuthenticationFilter
- 作用:用于处理基本认证(Basic Authentication)。
- 当请求需要进行认证时,客户端会将用户名和密码以 Base64 编码的形式添加到请求头中的
Authorization
字段中。这个过滤器负责解析这些信息并进行相应的认证。
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- JaasApiIntegrationFilter
- RememberMeAuthenticationFilter
- AnonymousAuthenticationFilter
- OAuth2AuthorizationCodeGrantFilter
- SessionManagementFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
- 作用:基于访问控制决策管理的核心过滤器,负责对访问请求进行拦截和决策。
- 在访问受保护资源时,这个过滤器会根据已配置的安全规则(如角色、权限等)进行访问控制决策,决定是否允许访问资源。
- SwitchUserFilter