春天的故事-Spring Security3十五日研究 – JAVA編程語言程序開發技術文章

 sparta-紫杉   2011-4-2 22:00



前言


    南朝《述異記》中記載,晉王質上山砍柴,見二童子下棋,未看完,斧柄已爛,下山回村,聞同代人都去世瞭,自已還未變老。
    因此發出“山中方一日,世上幾千年” 的慨嘆。原文寥寥幾筆,讀來卻發人深省。


    另有宋朝周敦頤在《暮春即事》中也有詩雲:雙雙瓦雀行書案,點點楊花入硯池。閑坐小窗讀周易,不知春去幾多時。


    上述古文或古詩中對於時間的論述最符合我現在的感受。已經整整十五日,對於Spring Serurity3的研究終於可以告一個段落瞭。


    感覺這過往的十五日仿佛一瞬間而過,我沉浸在此中,一種強烈的求知願望使我樂此不疲。到今天為止,終於將一種版本調通,可以正常使用瞭。
    再回頭看時,樓下的小公園裡已經開放瞭一叢叢黃色的花朵,整齊的柳樹叢林裡,已被春風剪出嫩綠的風景。
    再回頭看自己其間的經歷,有幾多所得做為鋪墊,所有的痛苦和疲憊已經煙消雲散瞭。
    欣喜之餘整理一下,一來梳理一下自己的認知,進一步深入的理解;二來可以記錄下來作為參考。


使用Spring Security3的四種方法概述


    那麼在Spring Security3的使用中,有4種方法:


    一種是全部利用配置文件,將用戶、權限、資源(url)硬編碼在xml文件中,已經實現過,並經過驗證;


    二種是用戶和權限用數據庫存儲,而資源(url)和權限的對應采用硬編碼配置,目前這種方式已經實現,並經過驗證。


    三種是細分角色和權限,並將用戶、角色、權限和資源均采用數據庫存儲,並且自定義過濾器,代替原有的FilterSecurityInterceptor過濾器,
    並分別實現AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,並在配置文件中進行相應配置。
    目前這種方式已經實現,並經過驗證。


    四是修改spring security的源代碼,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService兩個類。
    前者是將配置文件或數據庫中存儲的資源(url)提取出來加工成為url和權限列表的Map供Security使用,後者提取用戶名和權限組成一個完整的(UserDetails)User對象,該對象可以提供用戶的詳細信息供AuthentationManager進行認證與授權使用。
    該方法理論上可行,但是比較暴力,也沒有時間實現,未驗證,以後再研究。


    說明一下,我目前調通的環境為: java1.6 + struts2.1.6 + spring3.0.1 + hibernate3.3.1 + spring security3.0.2 + oracle9i + weblogic10.3,
    順便提一下,目前(2011-4-2)serutity的最新版本為3.1,比較穩定的版本為3.0.5和2.0.6。


    當然在進行spring security3的下面4種方法介紹之前,先假定SSH2的環境已經配置完畢,進入正常開發的過程,並且已經導入
    spring security3.0.2的5個jar包,分別為:
    spring-security-acl-3.0.2.RELEASE.jar
    spring-security-config-3.0.2.RELEASE.jar
    spring-security-core-3.0.2.RELEASE.jar
    spring-security-taglibs-3.0.2.RELEASE.jar
    spring-security-web-3.0.2.RELEASE.jar
    當然還有其他相關的jar包,在此不再贅述。



第一種方法


    第一種方法比較簡單,可參考Spring Security自帶的例子spring-security-samples-tutorial-3.0.2.RELEASE。
這裡給出下載網址:http://www.springsource.com/download/community?sid=1087087,不過在下載之前必須填寫相應的用戶信息,才允許下載。各種版本號的均可以下載。


    在spring-security-samples-tutorial-3.0.2.RELEASE的例子裡,硬編碼的配置請參見applicationContext-security.xml文件中的內容。
    裡面配置瞭用戶名、經過MD5加密後的密碼密文、相關的權限,以及與權相對應的訪問資源(URL)。還有對於Session超時時的處理。
    特別是因為版本號為3.0.2,因此還增加瞭對表達式的配置演示,具體內容請參見該例子。


    當然你最好運行起該例子來,感受一下,你可以直接將下載下來的解壓縮後的文件夾中找到spring-security-samples-tutorial-3.0.2.RELEASE.war文件,然後拷貝到Tomcat的安裝目錄下的webapps文件夾下,然後運行Tomcat的服務器,服務器在啟動過程中,會自動解開該war文件,在IE內輸入http://localhost:8080/webapps/spring-security-samples-tutorial-3.0.2.RELEASE 就可以運行該系統瞭。在此不再贅述。


第二種方法


    第二種方法的代碼如下:


    使用到的兩個表,用戶表和權限表的SQL語句。將用戶和權限以數據庫進行存儲。


 


create table USERS(
  USERNAME   VARCHAR2(50) not null,
  PASSWORD   VARCHAR2(50) not null,
  ENABLED    NUMBER(1) not null,
  USERNAMECN VARCHAR2(50),
  primary key( username )
)


create table AUTHORITIES(
  USERNAME  VARCHAR2(50) not null,
  AUTHORITY VARCHAR2(50) not null
)
— 外鍵使用戶和權限相聯。


Create/Recreate primary, unique and foreign key constraints
alter table AUTHORITIES
add constraint FK_AUTHORITIES_USERS foreign key (USERNAME)
references USERS (USERNAME);


可插入幾條數據做為試驗,首先插入用戶:


insert into users (USERNAME, PASSWORD, ENABLED, USERNAMECN, ROWID)
values (lxb, c7d3f4c857bc8c145d6e5d40c1bf23d9, 1, 登錄用戶, AAAHmhAALAAAAAOAAA);


insert into users (USERNAME, PASSWORD, ENABLED, USERNAMECN, ROWID)
values (admin, ceb4f32325eda6142bd65215f4c0f371, 1, 系統管理員, AAAHmhAALAAAAAPAAA);


insert into users (USERNAME, PASSWORD, ENABLED, USERNAMECN, ROWID)
values (user, 47a733d60998c719cf3526ae7d106d13, 1, 普通用戶, AAAHmhAALAAAAAPAAB);
再插入角色:



insert into authorities (USERNAME, AUTHORITY, ROWID)
values (admin, ROLE_PLATFORMADMIN, AAAHmjAALAAAAAgAAA);


insert into authorities (USERNAME, AUTHORITY, ROWID)
values (admin, ROLE_SYSADMIN, AAAHmjAALAAAAAgAAB);


insert into authorities (USERNAME, AUTHORITY, ROWID)
values (lxb, ROLE_LOGIN, AAAHmjAALAAAAAeAAA);


insert into authorities (USERNAME, AUTHORITY, ROWID)
values (lxb, ROLE_LOGINTOWELCOME, AAAHmjAALAAAAAeAAB);


insert into authorities (USERNAME, AUTHORITY, ROWID)
values (user, ROLE_USER, AAAHmjAALAAAAAgAAC);


第二種方法之密碼加密


    可能要有人要問,用戶表裡面的密碼是如何取得的呢?這個密碼是通過MD5進行加密過的,並且以用戶名做為瞭鹽值,最後就成為32位數字這個樣子,這個你可以參見下面applicationContext-Security.xml中的password-encoder和salt-source的配置就會明白。
    那麼在spring security3中是如何加密的呢?當我們設置瞭pawwrod-encoder和salt-source之後,Spring Security3會根據配置,采用相匹配的加密算法(比如設置瞭MD5加密算法)再加上salt-source進行加密,形成32位數字的密文。
    比如用戶名為yew,密碼為yew1234,鹽值為用戶名yew。那麼最後加密的明文為“yew1234{yew}”,密文就為“8fe2657d1599dba8e78a7a0bda8651bb”。


    我們在試驗過程中,通常喜歡先將幾個常用的用戶及密碼插入數據庫進行試驗,這種情況下如何得到該用戶的密碼密文呢?
    不妨試試我這個辦法,假設,用戶名為user,密碼明文為user369,而且在配置文件裡面設置瞭以MD5作為加密算法,並以用戶名做為鹽值。
    那麼你可以首先將各個信息組合成待加密的密碼明文, 應是 密碼明文 + { + 鹽值 + }, 那麼很明顯,上述user的密碼明文應當是:


    user369{user}


    拿上述的字串拷貝到 http://www.51240.com/md5jiami/ 網頁上的輸入框裡,點擊加密按鈕,下面即可生成32位數字的密碼密文。


    哈哈,屢試不爽啊。這個方法要謹慎使用,一般人我不告訴他。



第二種方法之相關配置


    將權限及資源(URL或Action)的關系配置在xml文件中,並且配置與Spring Security3相關的其他配置:


    1、applicationContext-Security.xml代碼:


 


<b:beans xmlns=”

發佈留言