到如今爲止,咱們已經將JBCP Pets站點作了一些用戶友好性方面的升級,包括一個自定義的登陸頁、修改密碼以及remember me功能。spring
在本章中,咱們將會把到目前爲止都在使用的內存存儲轉移到數據庫做爲後臺的認證存儲。咱們將會介紹默認的Spring Security數據庫schema,並介紹自定義擴展JDBC實現的方式。sql
在本章的課程中,咱們將會:數據庫
理解如何配置Spring Security才能使用JDBC訪問數據庫服務以實現用戶的存儲和認證;安全
學習如何使用基於內存數據庫HSQLDB的JDBC配置,咱們使用這個數據庫主要是爲了開發測試的目的;服務器
使得Spring Security的JDBC可以支持已經存在的遺留數據庫schemaide
掌握兩種管理用戶名和密碼的功能,二者都會涵蓋內置的和自定義的方式;工具
掌握配置密碼編碼的不一樣方法;學習
理解密碼salting技術以提供更安全的方式存儲密碼;測試
持久化用戶的remember me token,使得在服務器重啓後token仍能有效;編碼
經過配置SSL/TLS加密和端口映射,在傳輸層上保護應用的安全。
咱們進行安全控制的JBCP Pets應用有一個明顯問題是基於內存的用戶名和密碼存在時間比較短,對用戶很不友好。一旦應用重啓,任何的用戶註冊,密碼修改或者其餘的活動都會丟失。這是不可接受的,因此對於JBCP Pets應用的下一個邏輯實現功能就是從新設置Spring Security以使用關係型數據庫來進行用戶存儲和受權。使用JDBC訪問數據庫可以使得用戶的信息可以持久化,及時應用重啓依舊有效,另外更能表明現實世界中Spring Security的使用。
這個練習的第一部分是創建一個基於Java的關係數據庫HyperSQL DB(或簡寫爲HSQL)示例,並裝入Spring Security默認的schema。咱們將會經過使用Spring Security的嵌入式數據庫配置功能來設置HSQL在內存中運行,比起手動的安裝數據庫,這是一個很簡單的配置方法。
請記住在這個例子中(包括本書的其他部分),咱們將使用HSQL,主要是由於它很容易安裝。在使用這些例子的過程當中,咱們鼓勵修改這個配置以使用你喜歡的數據庫。鑑於咱們不想讓本書的這一部分過多關注於複雜數據庫的安裝,對練習來講咱們選擇了更簡便而不是更接近現實。
咱們提供了一個SQL文件(security-schema.sql),它將用來建立Spring Security使用HSQL所依賴的全部表。若是你使用本身的數據庫實例,你可能會須要調整schema的定義語法來適應特定的數據庫。咱們會將SQL文件置於classpath中,在WEB-INF/classes目錄下。
要配置HSQL嵌入式的數據庫,咱們須要修改dogstore-security.xml文件,以實現啓動數據庫並運行SQL來建立Spring Security表結構。
首先,咱們將會在文件的頂部添加對jdbc XML模式的應用:
<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" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/ spring-security3.0.xsd" >
接下來,咱們聲明<embedded-database>元素,以及對SQL腳本的引用:
<jdbc:embedded-database id="dataSource" type="HSQL"> <jdbc:script location="classpath:security-schema.sql"/> </jdbc:embedded-database>
若是此時重啓服務,你能夠在日誌上看到初始化HSQL數據庫。須要記住的是<embedded-database>只會在內存中建立數據庫,因此你在內存中看不到任何東西,也不能使用標準的工具進行查詢。
咱們須要修改dogstore-security.xml文件來聲明正在使用JDBC的UserDetailsService實現,替換咱們在第二章:Spring Security起步和第三章:加強用戶體驗中配置的Spring Security內存UserDetailsService實現。這經過一個對<authentication-manager>聲明的一個簡單改變來實現:
<authentication-manager alias="authenticationManager"> <authentication-provider> <jdbc-user-service data-source-ref="dataSource"/> </authentication-provider> </authentication-manager>
【data-source-ref引用了咱們在上一步聲明<embedded-database>時定義的bean。】
最後,咱們要建立另一個SQL文件,它將會在內存數據庫建立時執行。這個SQL文件將會包含默認用戶(admin和guest)的信息,以及GrantedAuthority設置(這一點咱們在前一章中已經用過了)。咱們將這個文件命名爲test-data.sql,並將其與security-schema.sql一塊兒放在WEB-INF/classes下:
insert into users(username, password, enabled) values ('admin','admin',true); insert into authorities(username,authority) values ('admin','ROLE_USER'); insert into authorities(username,authority) values ('admin','ROLE_ADMIN'); insert into users(username, password, enabled) values ('guest','guest',true); insert into authorities(username,authority) values ('guest','ROLE_USER'); commit;
接下來,咱們須要添加這個SQL文件到嵌入式數據庫配置中,它將會在啓動時加載:
<jdbc:embedded-database id="dataSource" type="HSQL"> <jdbc:script location="classpath:security-schema.sql"/> <jdbc:script location="classpath:test-data.sql"/> </jdbc:embedded-database>
在SQL添加到數據庫配置後,咱們應該可以啓動應用並登陸。Spring Security如今已經查找數據庫的認證和GrantedAuthority信息。
你可能會記起在第二章中講述的認證過程,AuthenticationManager委託AuthenticationProvider來校驗安全實體的憑證信息以肯定它是否可以訪問系統。咱們在第二章和第三章中使用的AuthenticationProvider
爲DaoAuthenticationProvider。這個provider又委託了一個UserDetailsService的實現來從憑證庫中檢索和校驗安全實體的信息。咱們可以經過如下的圖來反應第二章的過程:
正如你可能預期的那樣,數據庫後臺的認證存儲和內存存儲的惟一區別在於UserDetailsService的實現類。o.s.s.core.userdetails.jdbc.JdbcDaoImpl類提供了UserDetailsService的實現。不一樣於在內存中(經過Spring Security的配置文件添加)查找,JdbcDaoImpl在數據庫中查找用戶。
你可能意識到咱們根本沒有引用這個實現類。這是由於在更新後的Spring Security配置中<jdbc-user-service>聲明會自動配置JdbcDaoImpl並將其織入到AuthenticationProvider中。在本章接下類的內容中,咱們將會介紹如何配置Spring Security使用咱們自定義的JdbcDaoImpl實現,它繼續包含了修改密碼功能(在第三章中咱們添加到InMemoryDaoImpl了)。讓咱們看一下如何實現自定義的支持修改密碼功能的JdbcDaoImpl子類配置。