Spring Security 從配置入門 學習講解。萬惡之源------------web.xml

這段時間,工做閒了下來,接觸了Spring Security,對於我一個基礎不好的人來講,無疑是個挑戰啊。html

通過一段時間的摸索,終於有了點眉目,在這裏,要特別感謝http://blog.csdn.net/u012367513/article/details/38866465 二當家的 博文對個人幫助。個人代碼也是在他的基礎上整理而來,只是增長了本身的一些看法。 再次感謝他的幫助。java

個人基礎非常薄弱,最然 二當家的 博文中已經講解的非常清楚,可是我仍是但願本身能過上一遍。web

本文適宜讀者: Spring 基礎薄弱,和我同樣,配置文件大白的人。  但願高手們都留下寶貴的意見。spring

廢話很少說,開碼!安全

我但願看完這篇文章後咱們能解決一下問題:app

首先,Spring Security 究竟是用來幹嗎的?jsp

再次,Security 是怎麼工做的?ide

 

最後,咱們爲何要用Security。this

--------------------------------------------------------------------------url

我先大致上說下security的工做流程:

   Spring Security對Web安全性的支持大量地依賴於Servlet過濾器。這些過濾器攔截進入請求,而且在應用程序處理該請求以前進行某些安全處理。 Spring Security提供有若干個過濾器,它們可以攔截Servlet請求,並將這些請求轉給認證和訪問決策管理器處理,從而加強安全性。根據本身的須要,可使用表7.4中所列的幾個過濾器來保護本身的應用程序。 http://baike.baidu.com/link?url=LhguUpz1g7MnakDzFDFRK9D7n6u6wFffzSbJ7Zkcq3QMDNy741SpXMVGAb4jfz_GAa5J0ORkYvKEGYOD2bIQsa
對於概念,百度百科上的說很明瞭。
  在咱們訪問一個資源的以前,會被AuthenticationProcessingFilter(這個過濾器咱們會重寫)攔截,而後它會調用securityMetadataSource來獲取被訪問資源所對應的權限集合,而後調用accessDecisionManager 來確認,咱們用戶是否有權限訪問這個資源。
 
---------------------------說了這麼多 ,還沒見代碼。-------------------------------
每一個項目的訪問入口都是 web.xml,那咱們就看他的代碼:
 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SpringSecurityDemo</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 加載Spring security XML 配置文件
      爲何要配置這個文件?!!!
      由於百度! security是什麼?  就是依靠一個特殊的過濾器(DelegatingFilterProxy,他是幹嗎的?!),
      依靠他來委託一個在spring上下文的一個bean完成工做。
      而這個Bean,說白了就是一個過濾器。
   -->
  <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
        /WEB-INF/securityConfig.xml
        </param-value>
    </context-param>
    
    
  <!-- Spring 容器監聽,這尼瑪又是個什麼東東? 
      listener. 哦 ,是個監聽器啊。
      看看他的源碼
      public void contextInitialized(ServletContextEvent event)
    {
        contextLoader = createContextLoader();
        if(contextLoader == null)
            contextLoader = this;
        contextLoader.initWebApplicationContext(event.getServletContext());
    }
        瞅見了麼,就特麼是來加載上面配置的securityConfig.xml文件
   -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  
  <!-- 看吧,這就是看個特殊的過濾器,撒手掌櫃了,他到底幹什麼了,爲何咱們要配置他?
      咱們來扒開他的皮,瞅一瞅吧,
      //這是他的doFilter方法
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
        throws ServletException, IOException
    {
        Filter delegateToUse = null;
        synchronized(delegateMonitor)
        {
            if(_flddelegate == null)   //若是bean爲空
            {
                WebApplicationContext wac = findWebApplicationContext();  //給我拿來配置文件
                if(wac == null)            //蝦米?配置文件爲空?!  媽的,給老子拋異常! 你給老子監聽的配置吃啦?!
                    throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener registered?");
                _flddelegate = initDelegate(wac);   //這是什麼?猜都出來了,在配置文件裏召喚bean(感情配置文件就是人才市場,掌櫃的招小工了..)
            }
            delegateToUse = _flddelegate; //小工招用完了,就你啦...可憐,三方呢? 工資了?  你他媽的剛畢業吧....
        }
        invokeDelegate(delegateToUse, request, response, filterChain); //照完小工幹嗎去?  幹活唄!,給老子幹! 幹!
    }
    //這是initDeletegate
    protected Filter initDelegate(WebApplicationContext wac)
        throws ServletException
    {
        Filter delegate = (Filter)wac.getBean(getTargetBeanName(), javax/servlet/Filter);
        if(isTargetFilterLifecycle())
            delegate.init(getFilterConfig());
        return delegate;
    }
  
    //這是invokeDelegate
  protected void invokeDelegate(Filter delegate, ServletRequest request, ServletResponse response, FilterChain filterChain)
        throws ServletException, IOException
    {
        delegate.doFilter(request, response, filterChain);
    }
    
    咦? 不對呀,小工要造反了怎麼辦?  你無良老闆就啥都不幹? 
    對,我就是啥都不幹? 老子就是這麼任性。 老子把大家召喚來,就是給了大家生存的價值
 (DelegatingFilterProxy作的事情是代理Filter的方法,從application context裏得到bean。
       這讓bean能夠得到spring web application context的生命週期支持,使配置較爲輕便。)
大家就滿足吧!  唉...初來乍到,誰沒有被老闆坑過....
   -->
      <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>
View Code
 

 

轉載請註明做者: 晌午十一點半(http://www.cnblogs.com/qibotean) 原文地址: http://www.cnblogs.com/qibotean/p/4550539.html
相關文章
相關標籤/搜索