當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring源码解析之:Spring Security启动细节和工作模式--转载
生活随笔
收集整理的這篇文章主要介紹了
Spring源码解析之:Spring Security启动细节和工作模式--转载
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文地址:http://blog.csdn.net/bluishglc/article/details/12709557
Spring-Security的啟動加載細節 Spring-Security的啟動和Spring框架的啟動是一致的,都是從加載并解析xml配置文件開始的,spring通過注冊自己的ServletContextListener:ContextLoaderListener,來監聽ServletContext,一旦ServletContext建立完成,spring就開始加載并解析配置文件,然后初始化ioc容器了,具體的方法調用為: org.springframework.web.context.ContextLoaderListener#contextInitialized->org.springframework.web.context.ContextLoader#initWebApplicationContext
->org.springframework.web.context.ContextLoader#configureAndRefreshWebApplicationContext ->org.springframework.context.support.AbstractApplicationContext#refresh 到了refresh方法之后,開始進行一系列實質性的動作了,本文關心的兩個重要的動作見下圖注釋。這里有一點需要明確的是spring的bean解析和創建bean是兩個獨立的過程,在解析時生成的一種叫beandefinition的對象(存放于beanFactory的beanDefinitionMap里)代表一個將要創建的bean實例的諸多信息(如bean的class類名,構造參數,是singleton還是prototype等等)用于指導bean的創建。創建出來的bean實例存放于beanFactory的xxxxBeanMap、xxxxSingletonObjects等集合字段中。?
?
每一個過程: ?加載spring security的配置文件 通過下述方法調用加載spring security的xml配置文件org.springframework.web.context.ContextLoaderListener#contextInitialized ->org.springframework.web.context.ContextLoader#initWebApplicationContext ->org.springframework.web.context.ContextLoader#configureAndRefreshWebApplicationContext ->org.springframework.context.support.AbstractApplicationContext#refresh ->org.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactory ->org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory ->org.springframework.web.context.support.XmlWebApplicationContext#loadBeanDefinitions ->org.springframework.beans.factory.xml.XmlBeanDefinitionReader#loadBeanDefinitions // 自此處開始讀取spring的配置文件并解析之 ->org.springframework.beans.factory.xml.XmlBeanDefinitionReader#doLoadBeanDefinitions ->org.springframework.beans.factory.xml.XmlBeanDefinitionReader#registerBeanDefinitions ->org.springframework.beans.factory.xml.XmlBeanDefinitionReader#createReaderContext ->org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions ->org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#parseBeanDefinitions ->org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseCustomElement ->org.springframework.security.config.SecurityNamespaceHandler#parse
在org.springframework.beans.factory.xml.BeanDefinitionParserDelegate#parseCustomElement方法中,由于namespaceUri是http://www.springframework.org/schema/security,所以使用對應的Handler: org.springframework.security.config.SecurityNamespaceHandler來解析配置文件。我們可以從這個Handler的Parser列表中看來spring security下的所有一級元素對應的parser.
接下來,handler.parse()方法會根據當前的element,找到對應的parser進行解析。在我們的示例中,當前元素是<http/>,所以會使用org.springframework.security.config.http.HttpSecurityBeanDefinitionParser來解析<http/>元素。 org.springframework.security.config.http.HttpSecurityBeanDefinitionParser#parse ->org.springframework.security.config.http.HttpSecurityBeanDefinitionParser#createFilterChain ->org.springframework.security.config.http.HttpSecurityBeanDefinitionParser#createSecurityFilterChainBean 方法org.springframework.security.config.http.HttpSecurityBeanDefinitionParser#createFilterChain的一個重要的動作,那就是根據用戶的配置信息(這些信息已經包含在了各種builder中了,也就是代碼中的HttpConfigurationBuilder httpBldr,AuthenticationConfigBuilder authBldr 等)創建相關的Filter以及FilterChain(一個org.springframework.security.web.DefaultSecurityFilterChain)自身。不過這個方法創建的Filter和FilterChain都不是對應Class的真實實例,而只是一些place? holer(org.springframework.beans.factory.config.RuntimeBeanReference),到這個方法結束時它們的實例還沒有初始化.
第二個過程:實例化bean 當所有element對應的parser都完成解析之后,就開始創建bean的實例了(包括filter這些inner bean),這個過程發生成在方法org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors中,至于具體的初始化過程將在專門的一篇文章里描述,本文不再深究。 Spring-Security的切入點 spring security的整個工作模式是通過Servlet中的Filter機制,創建一個由多種Filter和Interceptor組成的FilterChain來實現的,以下是標準的spring-security嵌入web應用的配置方式: [html]?view plaincopy
這里撿兩個重要的filter說一下: ? UsernamePasswordAuthenticationFilter:該filter用于用戶初次登錄時驗證用戶身份(authentication)。該filter只在初次認證時存在,一旦認證通過將會從 filter chain中移除。 ? FilterSecurityInterceptor:當用戶登入成功之后,每次發送請求都會使用該filter檢查用戶是否已經通過了認證。如果通過了認證,就放行,否則轉向登錄頁面。 兩個filter的差別在于: 第一個負責初次登入時的用戶檢查,這個檢查需要根據用戶提供的用戶名和密碼去數據庫核對,若存在,將相關信息封裝在一個Authentication對象中。這個filter可以說是處理初次登錄時的authentication工作。而第二個filter則不需要像每個filter每次都去查詢數據庫,它只需要從 security context中查看當前請求用戶對應的Authentication?對象是否已經存在就可以了,這個filter處理的是登入成功之后的authentication工作。這個filter是需要攔截每次請求的。
轉載于:https://www.cnblogs.com/davidwang456/p/4527024.html
總結
以上是生活随笔為你收集整理的Spring源码解析之:Spring Security启动细节和工作模式--转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring security源码分析之
- 下一篇: spring security源码分析之