SpringSecurity優(yōu)略只見_第1頁
SpringSecurity優(yōu)略只見_第2頁
SpringSecurity優(yōu)略只見_第3頁
SpringSecurity優(yōu)略只見_第4頁
SpringSecurity優(yōu)略只見_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、SpringSecurity優(yōu)劣之我見拜讀了SpringSecurity相關(guān)帖子和SpringSecurity參考文檔?,F(xiàn)將我理解的SpringSecurity寫下來和大家共享。本文目的是從SpringSecurity能夠提供的功能、以及基本原理角度分析,并不深入到如何編碼。然后反過來,審查我們的軟件系統(tǒng)需要哪些權(quán)限控制。進(jìn)而評(píng)審SpringSecurity的適用性。本文力求文字簡單,概念也簡單。文章大綱:SpringSecurity如何控制權(quán)限概要與WE薛統(tǒng)的集成控制內(nèi)容細(xì)粒度權(quán)限控制我們理想中的權(quán)限管理客戶對(duì)權(quán)限管理的需求開發(fā)中遇到的難點(diǎn)我們理想的權(quán)限管理SpringSecurity的評(píng)價(jià)

2、優(yōu)點(diǎn)缺點(diǎn)SpringSecurity如何控制權(quán)限概要Spring使用由Filter組成的Chain,來判斷權(quán)限。如下圖所示:Spring預(yù)定義了很多out-of-boxedfilter供開發(fā)者直接使用。每個(gè)Filter一般情況下(有些Filter是abstract的),都和配置文件的一個(gè)元素(有的情況下可能是屬性)對(duì)應(yīng)。比如:AUTHENTICATION_PROCESSING_FILTER應(yīng)配置文件里面的:http/form-login元素。如果Spring提供的Filter不能滿足系統(tǒng)的權(quán)限功能,開發(fā)者可以自定義Filter,然后把Filter放在某個(gè)FilterChain的某個(gè)位置??梢蕴?/p>

3、換掉原有FilterChain的某個(gè)Filter也可以放在某個(gè)Filter之前或者之后??傊琒pringSecurity采用FilterChain模式判斷權(quán)限,Spring提供了一些Filter,也支持開發(fā)者自定義Filter。與WE薛統(tǒng)的集成使用JavaEE的Filter(非Spring的Filter)機(jī)制,將需要權(quán)限判斷的url,“牽引”給Spring的FilterChain即可。一般情況下,將所有的url都引入FilterChain。當(dāng)然也可以在web.xml配置需要權(quán)限判斷的url(配置filter-mapping/url-pattern)。Spring的配置文件也支持過濾掉不需要權(quán)

4、限判斷的url(配置http/intercept-url元素)??刂苾?nèi)容SpringSecurity提供了如下內(nèi)容的控制:1. url;2. beanmethod;3. httpsession。url:可以分為需要權(quán)限判斷的url,不需要權(quán)限判斷的url,登錄表單url。通過我對(duì)spring相關(guān)帖子和參考文檔的閱讀,需要權(quán)限判斷的url。僅限于做角色判斷,就是說判斷當(dāng)前用戶是否具有指定的角色。beanmethod:Spring支持對(duì)Servicelayermethod做權(quán)限判斷。通過我對(duì)spring相關(guān)帖子和參考文檔的閱讀,也僅限于做角色判斷。配置方式有2種:1 .寫在Java源代碼里面,如:

5、Secured(ROLE_TELLER)(該方法只有具有TELLER角色的用戶能夠訪問,否則拋出異常);2 .寫在配置文件里面,如:(該bean的所有set方法,只有具有ADMIN角色的用戶能夠訪問,否則拋出異常)。3 .httpsession:控制一個(gè)用戶名是否能重復(fù)登錄,以及重復(fù)登錄次數(shù),并非重試密碼次數(shù)。另外,SpringSecurity還提供了如下一些功能:1. rememberme,記住我;2. form-login登錄控制;3. 多種身份認(rèn)證功能;4. 用戶密碼加密和“salt”功能;5. http協(xié)議控制;6. 訪問端口控制;7. Pre-Invocation&After-Inv

6、ocation。rememberme記住我:還記彳#瀏覽器采用cookie記住用戶名和密碼自動(dòng)登錄嗎?好像就是這個(gè)(不知道我理解錯(cuò)了沒有,應(yīng)該沒有。只是我不大敢相信)。使用這個(gè)功能,開發(fā)者在登錄頁面,使用spring自定義的標(biāo)簽。form-login登錄控制:有些頁面不允許匿名訪問,那么當(dāng)匿名訪問這些頁面的時(shí)候,將彈出(或者轉(zhuǎn)到)form-login窗口(或者頁面)。這里又牽引出2個(gè)問題:1,輸入用戶名和密碼后怎樣驗(yàn)證;2,密碼是否需要加密,怎么加密。多種身份認(rèn)證功能:Spring提供了豐富的用戶身份認(rèn)證功能。身份認(rèn)證是什么意思?比如您告訴我“我是神仙。那么我會(huì)問您“憑什么證明您是神仙”。這就

7、是身份認(rèn)證。認(rèn)證手段一般是保存到數(shù)據(jù)庫表的用戶名/密碼,usbkey,ldap等。一般情況下,我們都使用用戶名/密碼的。用戶密碼加密和“salt”功能:密碼采用md5,還是sha加密算法。如果我們對(duì)密碼加密的時(shí)候,不想僅僅對(duì)密碼加密,還想把用戶名和密碼放在一起加密做為加密后的密碼。那么使用salt吧。salt支持也讀取用戶的其他屬性,不僅是用戶名。http協(xié)議控制:哪些url,必須采用https訪問呢?哪些url必須采用http訪問呢?哪些又兩者都可以呢?通過這個(gè)配置。訪問端口控制:類似http協(xié)議控制,控制url和訪問端口之間的關(guān)系。Pre-Invocation&After-Invocati

8、on:在方法調(diào)用之前做權(quán)限判斷,還是方法調(diào)用之后做權(quán)限判斷呢?一般情況下是之前調(diào)用。也有情況下是之后調(diào)用。具體例子可以看官方文檔(22.3小節(jié))。細(xì)粒度權(quán)限控制由上面分析,我們看到url、method的權(quán)限判斷,都僅限于用戶角色權(quán)限判斷。事實(shí)上Spring使用投票(Voter)機(jī)制,來做權(quán)限判斷。用戶角色權(quán)限也是一種投票。投票這個(gè)詞,聽起來不容易懂。舉例:董事會(huì)開會(huì),各個(gè)股東投票以表決決議是否通過。Spring的角色投票器,只會(huì)投出一票。我們平時(shí)所說的投票至少要2張票吧,一張還叫什么投票。Spring的投票有3種結(jié)果:允許、拒絕和棄權(quán)。棄權(quán)?真的有點(diǎn)暈。呵呵,這種情況下還棄權(quán)。那么投票器,如何

9、集成到Spring的Filter里面呢?Spring的Filter一般都由一個(gè)Manager支撐著。比如accessDecisionManager,可以由RoleVoter和BasicAclEntryVoter提供投票。accessDecisionManager根據(jù)RoleVoter,BasicAclEntryVoter投票結(jié)果,做出決策判斷。細(xì)粒度(數(shù)據(jù)級(jí))的權(quán)限控制,SpringSecurity提供了一種模型以及相關(guān)實(shí)現(xiàn)。下面我簡要說說這個(gè)模型。舉例:張三授權(quán)查詢?nèi)A北區(qū)域客戶資料,李四授權(quán)查詢?nèi)A南區(qū)域客戶資料。那么,首先會(huì)對(duì)所有客戶記錄做個(gè)標(biāo)示(相當(dāng)于取個(gè)id),然后在acl-entry表

10、給張三授權(quán)華北所有客戶訪問權(quán)限;給李四華南區(qū)域所有客戶權(quán)限。表記錄大致是這樣的:訪問用戶被訪問數(shù)據(jù)授權(quán)操作張三華北電力客戶1讀取張三華北電力客戶2讀取李四華南電力客戶1讀取,這個(gè)模型的缺點(diǎn)是非常明顯的:1. 和業(yè)務(wù)數(shù)據(jù)綁定死了,業(yè)務(wù)數(shù)據(jù)的增/刪,需要維護(hù)該權(quán)限表;2. 在大數(shù)據(jù)量的情況下,系統(tǒng)效率低下。因此,開發(fā)者需要自己書寫投票器了。我們理想中的權(quán)限管理客戶對(duì)權(quán)限管理的需求這里是指我們服務(wù)的最終用戶,而不是軟件開發(fā)者。客戶對(duì)權(quán)限管理的需求,大體可以概括如下:1.自主靈活地管理角色、角色權(quán)限,并將角色賦予系統(tǒng)相關(guān)用戶;2. 數(shù)據(jù)安全。系統(tǒng)展現(xiàn)數(shù)據(jù)是滿足權(quán)限的,在系統(tǒng)內(nèi)部搜索數(shù)據(jù)也必須在相應(yīng)權(quán)限

11、訪問內(nèi),對(duì)系統(tǒng)數(shù)據(jù)進(jìn)行增加、修改、刪除必須是滿足權(quán)限的;3. 沒有功能的按鈕、菜單、數(shù)據(jù)等等,就不要在界面上出現(xiàn)了。開發(fā)中遇到的難點(diǎn)管理用戶、角色、權(quán)限,以及三者之間的關(guān)系,這種典型的RBAC莫型,非常容易,沒有任何困難。困難的是,數(shù)據(jù)級(jí)權(quán)限控制。這是和業(yè)務(wù)直接掛鉤的,最復(fù)雜,而且會(huì)經(jīng)常因?yàn)榭蛻粜枨蟊磉_(dá)不到位、開發(fā)人員需求理解不到位、系統(tǒng)框架庫表結(jié)構(gòu)發(fā)生變化,而不斷變化的。這種變化,不僅需要編碼,而且還需要重新測(cè)試。甚至這種變化會(huì)波及到其他模塊,甚至整個(gè)系統(tǒng)。系統(tǒng)開發(fā)經(jīng)歷幾次變化下來,代碼里面散布著if/else,散布著sql語句。導(dǎo)致badsmell。我們理想的權(quán)限管理我們期望的權(quán)限管理,應(yīng)

12、該具有這么幾個(gè)特性:1. 能實(shí)現(xiàn)角色級(jí)權(quán)限;能實(shí)現(xiàn)數(shù)據(jù)級(jí)權(quán)限;2. 簡單、易操作,能夠應(yīng)對(duì)各種需求;3. 應(yīng)對(duì)需求變更能力強(qiáng);4. 最好有相關(guān)界面,比如權(quán)限管理界面、角色管理界面,角色和權(quán)限關(guān)系維護(hù)界面,用戶和角色關(guān)系維護(hù)界面。如果沒有界面,也是可以接受的。畢竟這些頁面需要最終用戶來使用,不同用戶對(duì)系統(tǒng)的界面要求不同。因此我們并不期望統(tǒng)一的管理界面。SpringSecurity的評(píng)價(jià)在SpringSecurity世界里,可以區(qū)分出哪些資源可以匿名訪問,哪些需要角色權(quán)限,又是哪個(gè)頁面提供登錄功能;怎樣進(jìn)行用戶身份認(rèn)證,用戶的密碼如何加密。哪些資源必須使用https協(xié)議,資源和訪問端口有怎樣的對(duì)應(yīng)

13、關(guān)系。優(yōu)點(diǎn)總體說來SpringSecurity具有以下幾個(gè)優(yōu)點(diǎn):1. 提供了一套權(quán)限框架,這套框架是可行的;2. 提供了很多用戶身份認(rèn)證功能,可以節(jié)約大量開發(fā)工作;3. 提供了角色判斷功能,這點(diǎn)既是優(yōu)點(diǎn)又是缺點(diǎn);4. 提供了form-login、rememberme等控制。其中2、4兩點(diǎn),對(duì)于我們中國開發(fā)者(我對(duì)國外系統(tǒng)不大了解),可用性并不大。我們的系統(tǒng)大多采用用戶名/密碼身份認(rèn)證模式,大多公司都有可復(fù)用代碼。form-loginrememberme等這些功能,并不是難以開發(fā),而且可用之處也并不多。缺點(diǎn)我個(gè)人認(rèn)為SpringSecurity存在以下幾個(gè)硬傷:1 .角色被“編碼”到配置文件和源

14、文件,這樣最終用戶就不能創(chuàng)建角色了。但最終用戶期望自己來控制角色。因?yàn)樵陧?xiàng)目實(shí)施過程中,客戶可能并不能確定有哪些角色,以及角色怎么分配給系統(tǒng)用戶。角色大多需要等到系統(tǒng)上線后,才能確定。這些編碼有:a) url的權(quán)限控制,;b) java方法的權(quán)限控制,Secured(IS_AUTHENTICATED_ANONYMOUSLY)c) java方法的權(quán)限控制,;2. RBC蜒種被廣泛運(yùn)用的模型,沒有在SpringSecurity體現(xiàn)出來;3. SpringSecurity沒有提供好的細(xì)粒度(數(shù)據(jù)級(jí))權(quán)限方案,提供的缺省實(shí)現(xiàn)維護(hù)工作量大,在大數(shù)據(jù)量情況下,幾乎不可用;4. SpringSecurity

15、對(duì)于用戶、角色、權(quán)限之間的關(guān)系,沒有提供任何一種維護(hù)界面。不過從SpringSecurity角度看,確實(shí)沒有必要有界面。角色創(chuàng)建、角色和權(quán)限直接的關(guān)系,都被“編碼”到配置文件和源文件了;5. SpringSecurity學(xué)習(xí)難度大,配置文件還是很多。我承認(rèn)有很多高手,但我們也看到有很多新人加入軟件開發(fā)領(lǐng)域。付出如此大的學(xué)習(xí)代價(jià),獲得這么一點(diǎn)點(diǎn)好處,個(gè)人覺得并不值得。附言:本人在JavaEye創(chuàng)建“權(quán)限管理”圈子快2周了,吸引不少網(wǎng)友進(jìn)來。我感到很高興,也很榮幸。由于SpringSecurity運(yùn)用范圍還是比較廣的,所以我打算好好學(xué)習(xí)一下,把學(xué)習(xí)經(jīng)驗(yàn)和大家分享一下。歡迎大家加入“權(quán)限管理”圈子討

16、論,探討對(duì)權(quán)限管理的認(rèn)識(shí)、看法、建議等等。論壇帖子:我們公司從以前的acegi一直到現(xiàn)在的springsecurity都在用,但有點(diǎn)建議就是,不要按官方例子去做(官方例子太爛而且某些地方有誤導(dǎo)之嫌,還有bug呵呵),不要用命名空間xml方式去配置,springsecurity是我用過的關(guān)于權(quán)限管理的最強(qiáng)大框架,但用好并不是易事,可以說springsecurity只是半成品,他的很多東西都需要自己去實(shí)現(xiàn)和修改才能真正發(fā)揮出他的威力,如果你們公司有一定的研發(fā)能力的話,在它的基礎(chǔ)上做些改進(jìn),甚至可以做到字段級(jí)的權(quán)限管理粒度,我們就這么做了,效果相當(dāng)?shù)耐昝缽?qiáng)調(diào)一點(diǎn),springsecurity和spr

17、ing結(jié)合是非常密切的,要想用好springsecurity,你們的架構(gòu)中至少要引入spring容器來管理所有需要管理權(quán)限的東西,比如數(shù)據(jù)層、服務(wù)層等,雖然按官方的聲明是可以脫離spring容器獨(dú)立使用springsecurity,但那樣實(shí)現(xiàn)起來相對(duì)比較耗費(fèi)精力,并且需要自己去做部分權(quán)限判斷。按你所舉的例子里,我不確定你們是否后臺(tái)只用servlet來處理數(shù)據(jù),請(qǐng)告訴我你們準(zhǔn)確的架構(gòu)。springsecurity的官方demo寫的有點(diǎn)爛,甚至可以說是不值一看,尤其是它的基于SpringXMLschema的簡化配置和硬編碼的應(yīng)用方式誤導(dǎo)了很多想在產(chǎn)品化中應(yīng)用它的人,嚴(yán)中掩蓋了它本身強(qiáng)大的設(shè)計(jì)思想。

18、springsecurity本身可以說只是一個(gè)半成品,而它的demo也是基于這個(gè)半成品將就著寫出來的,當(dāng)然不適合產(chǎn)品化的靈活應(yīng)用。不過對(duì)付簡單網(wǎng)站或入門學(xué)習(xí)還是夠用的。從某中程度上來說demo只是提供了springsecurity最原始的一種應(yīng)用方式。適用架構(gòu)功能1提供各種認(rèn)證方式2B/S基于過濾器鏈方式的url制ui視圖組件的顯/隱訪問控制?;趕s提供的tag控RBACc/c基于springB/S、C/S由制容器提供的AOPJ式的切面實(shí)現(xiàn)method訪問控RBAC基于springB/S、C/S工匚一、山和過濾容器提供的AO叨式的切面實(shí)現(xiàn)事后數(shù)據(jù)審查ACLRBACB/S、C/S基于sprin

19、g容器提供的AspectJ方式的切面實(shí)現(xiàn)任意bean的字段控制RBAC其中第4點(diǎn)能實(shí)現(xiàn)你例子中所說的對(duì)各個(gè)單據(jù)授權(quán),即對(duì)象(記錄)級(jí)授權(quán)控制(最好用JPA方式實(shí)現(xiàn),這樣可以避免JDBC的一些通用性問題)如果你要實(shí)現(xiàn)完全基于數(shù)據(jù)庫的動(dòng)態(tài)權(quán)限定義,安全對(duì)象資源定義、授權(quán)、角色定義、用戶組、角色分層、記錄級(jí)授權(quán)、字段級(jí)授權(quán),基于分層組織架構(gòu)權(quán)限等,并且使權(quán)限管理模塊完全可插拔到不同的項(xiàng)目中,你必須完全拋棄demo的那種配置方式,并結(jié)合spring使用java代碼編程式去配置。這就需要你對(duì)spring容器、面向切面編程(AOP和AspectJ)、RBAC真型、ACL模型、都要有比較深入的理解。還強(qiáng)調(diào)一點(diǎn),springsecu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論