儘管Spring Security的配置可能會很難,可是它的做者是至關爲咱們着想的,由於他們爲咱們提供了一種簡單的機制來使用它不少的功能並能夠此做爲起點。以這個爲起點,額外的配置可以實現應用的分層次詳細的安全控制。web
咱們將從咱們不安全的在線商店開始,而且使用三步操做將它變成一個擁有基本用戶名和密碼安全認證的站點。這個認證僅僅是爲了闡述使用Spring Security使咱們應用變得安全的步驟,因此你可能會發現這樣的方式會有明顯不足,這將會引領咱們在之後的配置中不斷進行改良。spring
起點配置的第一步是建立一個XML的配置文件,用來描述全部須要的Spring Security組件,這些組件將會控制標準的web請求。數據庫
在WEB-INFO目錄下創建一個名爲dogstore-security.xml的XML文件。文件的內容以下所示:安全
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/ spring-security-3.0.xsd"> <http auto-config="true"> <intercept-url pattern="/*" access="ROLE_USER"/> </http> <authentication-manager alias="authenticationManager"> <authentication-provider> <user-service> <user authorities="ROLE_USER" name="guest" password="guest"/> </user-service> </authentication-provider> </authentication-manager> </beans:beans>這是咱們應用中得到最小安全配置的惟一一個 Spring Security 配置文件。這個配置文件的格式使用了 Spring Security 特定的 XML 語法,通常稱之爲 security 命名空間。它在 XML 的命名空間中聲明( http://www.springframework.org/schema/security )並與 XML 配置元素關聯。咱們將在在第六章:高級配置與擴展中討論一種替代的配置方式,即便用傳統的 Spring Bean 設置方式。
【討厭Spring XML配置的用戶可能會失望了,由於Spring Security沒有像Spring那樣提供可替代的註解機制。仔細想一下也是能夠理解的,由於Spring Security關注的是整個系統而不是單個對象或類。但將來,咱們可能可以在Spring MVC的控制器上使用安全註解,而不是在一個配置文件中指明URL模式!】架構
儘管在Spring Security中註解並不廣泛,但正如你所預料的那樣,對類或方法進行的配置是能夠經過註解來完成的。咱們將在第五章:精確的訪問控制中介紹。app
Spring Security對咱們應用的影響是經過一系列的ServletRequest過濾器實現的(咱們將會在介紹Spring Security架構的時候進行闡述)。能夠把這些過濾器想成位於每一個到咱們應用的請求周圍的具備安全功能的三明治。(這個比喻夠新鮮,不過Spring Security的核心確實就是一系列介於真正請求之間的過濾器,譯者注)。框架
Spring Security使用了o.s.web.filter.DelegatingFilterProxy這個servlet過濾器來包裝全部的應用請求,從而保證它們是安全的。ide
【DelegatingFilterProxy其實是Spring框架提供的,而不是安全特有的。這個過濾器通常在Spring構建的web應用工程中使用,並將依賴於servlet過濾器的Spring Bean與Servle過濾器的生命週期結合起來。】編碼
經過在web.xml部署描述文件中添加以下的代碼,就能夠配置這樣一個過濾器。這段代碼位於Spring MVC的<servlet-mapping>以後:url
<filter> <filter-name>springSecurityFilterChain</filter-name> <filterclass> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>咱們所作的是使用一個 ServletRequest 過濾器並將它配置成處理匹配給定 URL 模式( /* )的請求。由於咱們配置的這個通配符模式匹配全部的 URL ,因此這個過濾器將會應用於每一個請求。
若是你有心的話,可能會發現這與咱們的Spring Security配置文件即dogstore-security.xml沒有任何的關係。爲了實現這個,咱們須要添加一個XML配置文件的應用到web應用的部署描述文件web.xml中。
取決於你如何配置你的Spring web應用,不知你是否已經在web.xml中有了對XML 配置文件的明確引用。Spring web的ContextLoaderListener的默認行爲是尋找與你的Spring web servlet同名的XML配置文件。讓咱們看一下如何添加這個新的Spring Security XML配置文件到已經存在的JBCP Pet商店站點中。
首先,咱們須要看一下這個應用是否使用了Spring MVC的自動查找XML配置文件的功能。咱們看一下在web.xml中servlet的名字,以<servlet-name>原始進行標識:
<servlet> <servlet-name>dogstore</servlet-name> <servletclass> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>Servlet 的名字是( <servlet-name> )是 dogstore ,因此 Spring 的約定勝於配置( Convention
over Configuration,CoC)將會在WEB-INF目錄下尋找名爲dogstore-servelt.xml的配置文件。咱們沒有覆蓋這種默認行爲,你能在WEB-INF目錄下找到這個文件,它包含了一些Spring MVC相關的配置。
【不少Spring Web Flow和Spring MVC的用戶並不明白這些CoC規則是如何生效的以及Spring的代碼中在何處聲明瞭這些規則。o.s.web.context.support.XmlWebApplicationContext和它的父類是瞭解這些的一個很好的起點。JavaDoc在講解基於Spring MVC框架的web工程的一些參數配置方面也作得不錯。】
也能夠聲明額外的Spring ApplicationContext配置文件,它將會先於Spring MVC servle關聯的配置文件加載。這經過Spring的o.s.web.context.ContextLoaderListener建立一個獨立於Spring MVC ApplicationContext的另外一個ApplicationContext來實現。這是一般的非Spring MVC beans配置的方式,也爲Spring Security相關的配置提供了一個好地方。
在web應用的部署描述文件中,用來配置ContextLoaderListener的XML文件地址是在<context-param>元素中給出的:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/dogstore-base.xml </param-value> </context-param>
dogstore-base.xml文件中包含了一些標準的Spring bean的配置,如數據源、服務層bean等。如今,咱們可以添加一個包含Spring Security的XML配置文件了,下面是更新後的<context-param>元素:
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/dogstore-security.xml /WEB-INF/dogstore-base.xml </param-value> </context-param>
在咱們添加完新的Spring Security配置文件到web部署文件並重啓web工程後,嘗試訪問應用的首頁地址:http://localhost:8080/JBCPPets/home.do,你將會看到以下的界面:
漂亮!咱們已經使用Spring Security在三步以內實現了一個簡單的安全層。在這裏,你可使用guest做爲用戶名和密碼進行登陸。接着你將可以看到JBCP Pets應用的一個簡單首頁。
爲了簡便起見,本章的源碼只包含了所有JBCP Pets整個應用的很小一部分(只有一個頁面)。咱們這麼作是爲了更簡潔,同時也能讓構建和部署應用時沒必要考慮咱們將在後續章節中涉及到的附加功能。這也提供了一個很好的起點讓你快速的體驗參數的配置並從新部署以查看它們是否生效。
到此爲止,思考一下咱們所作的事情。你可能已經意識到在產品化以前應用存在不少很明顯的問題,這須要不少後續的工做和對Spring Security產品的瞭解。嘗試列舉一下在將這個實現安全功能的站點上線前還須要什麼樣的完善。
實現Spring Security起點級別的配置是至關迅速的,它已經提供了一個登陸界面,用戶名密碼認證以及自動攔截咱們在線商店的URL。可是在自動配置給咱們提供的功能與咱們的最終目標之間有很大的差距:
<!--[if !supportLists]-->l <!--[endif]-->咱們將用戶名、密碼以及角色信息硬編碼到XML配置文件中。你是否還記得咱們添加的這部分XML內容:
<authentication-manager alias="authenticationManager"> <authentication-provider> <user-service> <user authorities="ROLE_USER" name="guest" password="guest"/> </user-service> </authentication-provider> </authentication-manager>你能夠看到用戶名和密碼在這個文件中。你不可能願意爲每個系統的用戶都在這個 XML 文件中添加一個聲明。要解決這個問題,你須要使用一個基於數據庫的認證提供者( authentication provider )來替代它(咱們將第四章:憑證安全存儲完成它)。
<!--[if !supportLists]-->l <!--[endif]-->咱們對全部的頁面都進行了安全控制,包括一些潛在客戶可能想匿名訪問的界面。咱們須要完善系統的角色以適應匿名的、認證過的以及管理權限的用戶(這也將在第四章中討論)。
<!--[if !supportLists]-->l <!--[endif]-->登陸界面很是應用,可是它太基礎了並且與咱們JBCP商店風格一點也不一致。咱們須要添加一個登陸的form界面,並與咱們應用的外觀和風格一致(咱們將在下一章解決這個問題)。
不少用戶在初次使用Spring Security時會遇到一些問題。咱們列出了幾個常見的問題和建議。咱們但願你可以一直跟隨着本書的講解,運行咱們示例代碼。
<!--[if !supportLists]-->l <!--[endif]-->確保你的應用在添加Spring Security以前是能夠編譯和部署的。必要的時候看一些你所使用的servlet容器的入門級例子和文檔。
<!--[if !supportLists]-->l <!--[endif]-->一般使用一個IDE如Eclipse會極大地簡化你使用的servlet容器。不只可以保證部署準確無誤,它所提供的控制檯日誌也很易讀可用來檢查錯誤。你還能夠在關鍵的位置添加斷點,運行的時候會觸發從而簡化分析錯誤的過程。
<!--[if !supportLists]-->l <!--[endif]-->若是你的XML配置文件不正確,你會獲得這樣的提示信息(或相似的):org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'。爲實現Spring Security的正確配置須要各類各樣的XML命名空間引用,這可能會使不少用戶感到迷惑。從新檢查一下這個例子,仔細查看一下schame聲明的部分,並使用XML校驗器來保證你沒有不合法的XML。
<!--[if !supportLists]-->l <!--[endif]-->確保你所使用的Spring和Spring Security版本匹配,並確保沒有你的應用中不存在沒用的Spring jar包。