acegi到Spring security的轉換方式
以前叫做spring的acegi安全框架,現在重新標識為spring security 2.0,它實現了簡易配置的承諾,提高了開發者的生產力。它已經是java平臺上應用最廣的安全框架了,在sourceforge上擁有250,000的下載量,Spring Security 2.0又提供了一系列的新功能。
Spring Security是什么
Spring Security是目前用于替換acegi的框架,它提供了一系列新的功能。
◆大為簡化了配置
◆繼承OpenID,標準單點登錄
◆支持windows NTLM,在windows合作網絡上實現單點登錄
◆支持JSR 250("EJB 3")的安全注解
◆支持AspectJ切點表達式語言
◆全面支持REST Web請求授權
◆長期要求的支持組,層級角色和用戶管理API
◆提升了功能,使用后臺數據庫的remember-me實現
◆通過spring webflow 2.0對web狀態和流轉授權進行新的支持
◆通過Spring Web Services 1.5加強對WSS(原來的WS-Security)的支持
◆整個更多的……
目標
目前,我工作在一個spring的web應用上,使用acegi控制對資源的訪問權限。用戶信息保存在數據庫中,我們配置acegi使用了基于JDBC的UserDetails服務。同樣的,我們所有的web資源都保存在數據庫里,acegi配置成使用自定義的 AbstractFilterInvocationDefinitionSource,對每個請求檢測授權細節。
隨著Spring Security 2.0的發布,我想看看是不是可以替換acegi,但還要保持當前的功能,使用數據庫作為我們驗證和授權的數據源,而不是xml配置文件(大多數演示程序里使用的都是xml)。
這里是我采取的步驟……
步驟
1.第一步(也是最重要的)是下載新的Spring Security 2.0框架,并確保jar文件放到正確的位置(/WEB-INF/lib/)。
Spring Security 2.0下載包里包含22個jar文件。我不需要把它們全用上(尤其是那些sources包)。在這次練習中我僅僅包含了以下幾個:
◆spring-security-acl-2.0.0.jar
◆spring-security-core-2.0.0.jar
◆spring-security-core-tiger-2.0.0.jar
◆spring-security-taglibs-2.0.0.jar
2.在web.xml文件里配置一個DelegatingFilterProxy
3.Spring Security 2.0的配置比acegi簡單太多了,所以我沒有在以前acegi配置文件的基礎上進行修改,我發現從一個空白文件開始更簡單。如果你想修改你以前的配置文件,我確定你刪除的行數比添加的行數還要多。配置文件的第一部分是指定安全資源過濾器的細節,這讓安全資源可以通過數據庫讀取,而不是在配置文件里保存信息。這里是一個你將在大多數例子中看到的代碼。
使用這些內容進行替換:
這段配置的主要部分secureResourceFilter,這是一個實現了FilterInvocationDefinitionSource 的類,它在Spring Security需要對請求頁面檢測權限的時候調用。這里是MySecureResouceFilter的代碼:
getAttributes()方法返回權限的名稱(我稱之為角色),它們控制當前url的訪問權限。
4.好了,現在我們需要安裝信息數據庫,下一步是讓Spring Security從數據庫中讀取用戶信息。這個Spring Security 2.0的例子告訴你如何從下面這樣的配置文件里獲得用戶和權限的列表:
你可以把這些例子的配置替換掉,這樣你可以像這樣從數據庫中直接讀取用戶信息:
這里有一種非常快速容易的方法來配置安全數據庫,意思是你需要使用默認的數據庫表結構。默認情況下,<jdbc-user- service>需要下面的幾個表:user,authorities,groups,group_members和 group_authorities。
我的情況下,我的安全數據庫表無法這樣工作,它和<jdbc-user-service>要求的不同,所以我需要修改<authentication-provider>:
通過添加users-by-username-query和authorities-by-username-query屬性,你可以使用你自己的 SQL覆蓋默認的SQL語句。就像在acegi中一樣,你必須確保你的SQL語句返回的列與Spring Security所期待的一樣。這里有另一個group-authorities-by-username-query屬性,我在這里沒有用到,所以也沒有出現在這里例子中,不過它的用法與其他兩個SQl語句的方法完全一致。
<jdbc-user-service>的這些功能大概是在上個月才加入的,在Spring Security之前版本中是無法使用的。幸運的是它已經被加入到Spring Security中了,這讓我們的工作更加簡單。你可以通過 這里 和這里 獲取信息。
dataSource bean中指示的是鏈接數據庫的信息,它沒有包含在我的配置文件中,因為它并不只用在安全中。這里是一個dataSource的例子,如果誰不熟悉可以參考一下:
5.這就是Spring Security的所有配置文件。我最后一項任務是修改以前的登陸頁面。在acegi中你可以創建自己的登陸<form>,向正確的URL發送正確命名的HTML輸入元素。現在你也可以在Spring Security 2.0里這樣做,只是一些名稱發生了改變。你可以像以前一樣使用用戶名j_username和密碼j_password。
但是你必須把<form>中的action指向j_spring_security_check而不是j_acegi_security_check。
在你的應用中有一些地方,用戶可以進行注銷,這是一個鏈接把注銷請求發送給安全框架,這樣它就可以進行相應的處理。需要把它從j_acegi_logout改成j_spring_security_logout。
總結
這個簡短的指南,包含了如何配置Spring Security 2.0使用數據庫中的資源,它并沒有演示Spring Security 2.0中的新特性,然而我想它可以演示一些非常常用的框架功能,我希望你們覺得它有用。
Spring Security 2.0與acegi相比的好處之一是配置文件非常簡單,這在我比較老acegi配置文件(172行)和新配置文件(42行)的時候,清楚的顯示出路愛。
這里是我完整的securityContext.xml文件:
就像在第一步時提到到,下載Spring Security是最重要的步驟。從那里開始就可以一帆風順了。
【編輯推薦】