當前位置:編程學習大全網 - 源碼下載 - 使用spring security框架打開頁面怎麽這麽慢

使用spring security框架打開頁面怎麽這麽慢

SpringSecurity如何控制權限概要Spring使用由Filter組成的Chain,來判斷權限。如下圖所示:Spring預定義了很多out-of-boxedfilter供開發者直接使用。每個Filter壹般情況下(有些Filter是abstract的),都和配置文件的壹個元素(有的情況下可能是屬性)對應。比如:AUTHENTICATION_PROCESSING_FILTER,對應配置文件裏面的:http/form-login元素。如果Spring提供的Filter不能滿足系統的權限功能,開發者可以自定義Filter,然後把Filter放在某個FilterChain的某個位置。可以替換掉原有FilterChain的某個Filter,也可以放在某個Filter之前或者之後。總之,SpringSecurity采用FilterChain模式判斷權限,Spring提供了壹些Filter,也支持開發者自定義Filter。與WEB系統的集成使用JavaEE的Filter(非Spring的Filter)機制,將需要權限判斷的url,“牽引”給Spring的FilterChain即可。壹般情況下,將所有的url都引入FilterChain。當然也可以在web.xml配置需要權限判斷的url(配置filter-mapping/url-pattern)。Spring的配置文件也支持過濾掉不需要權限判斷的url(配置http/intercept-url元素)。控制內容SpringSecurity提供了如下內容的控制:1.url;2.beanmethod;3.httpsession。url:可以分為需要權限判斷的url,不需要權限判斷的url,登錄表單url。通過我對spring相關帖子和參考文檔的閱讀,需要權限判斷的url。僅限於做角色判斷,就是說判斷當前用戶是否具有指定的角色。beanmethod:Spring支持對Servicelayermethod做權限判斷。通過我對spring相關帖子和參考文檔的閱讀,也僅限於做角色判斷。配置方式有2種:1.寫在Java源代碼裏面,如:@Secured("ROLE_TELLER")(該方法只有具有TELLER角色的用戶能夠訪問,否則拋出異常);2.寫在配置文件裏面,如:(該bean的所有set方法,只有具有ADMIN角色的用戶能夠訪問,否則拋出異常)。httpsession:控制壹個用戶名是否能重復登錄,以及重復登錄次數,並非重試密碼次數。另外,SpringSecurity還提供了如下壹些功能:1.rememberme,記住我;2.form-login登錄控制;3.多種身份認證功能;4.用戶密碼加密和“salt”功能;5.http協議控制;6.訪問端口控制;7.Pre-Invocation&After-Invocation。rememberme,記住我:還記得瀏覽器采用cookie記住用戶名和密碼自動登錄嗎?好像就是這個(不知道我理解錯了沒有,應該沒有。只是我不大敢相信)。使用這個功能,開發者在登錄頁面,使用spring自定義的標簽。form-login登錄控制:有些頁面不允許匿名訪問,那麽當匿名訪問這些頁面的時候,將彈出(或者轉到)form-login窗口(或者頁面)。這裏又牽引出2個問題:1,輸入用戶名和密碼後怎樣驗證;2,密碼是否需要加密,怎麽加密。多種身份認證功能:Spring提供了豐富的用戶身份認證功能。身份認證是什麽意思?比如您告訴我“我是神仙”。那麽我會問您“憑什麽證明您是神仙”。這就是身份認證。認證手段壹般是保存到數據庫表的用戶名/密碼,usbkey,ldap等。壹般情況下,我們都使用用戶名/密碼的。用戶密碼加密和“salt”功能:密碼采用md5,還是sha加密算法。如果我們對密碼加密的時候,不想僅僅對密碼加密,還想把用戶名和密碼放在壹起加密做為加密後的密碼。那麽使用salt吧。salt支持也讀取用戶的其他屬性,不僅是用戶名。http協議控制:哪些url,必須采用https訪問呢?哪些url必須采用http訪問呢?哪些又兩者都可以呢?通過這個配置。訪問端口控制:類似http協議控制,控制url和訪問端口之間的關系。Pre-Invocation&After-Invocation:在方法調用之前做權限判斷,還是方法調用之後做權限判斷呢?壹般情況下是之前調用。也有情況下是之後調用。具體例子可以看官方文檔(22.3小節)。細粒度權限控制由上面分析,我們看到url、method的權限判斷,都僅限於用戶角色權限判斷。事實上Spring使用投票(Voter)機制,來做權限判斷。用戶角色權限也是壹種投票。投票這個詞,聽起來不容易懂。舉例:董事會開會,各個股東投票以表決決議是否通過。Spring的角色投票器,只會投出壹票。我們平時所說的投票至少要2張票吧,壹張還叫什麽投票。Spring的投票有3種結果:允許、拒絕和棄權。棄權?真的有點暈。呵呵,這種情況下還棄權。那麽投票器,如何集成到Spring的Filter裏面呢?Spring的Filter壹般都由壹個Manager支撐著。比如accessDecisionManager,可以由RoleVoter和BasicAclEntryVoter提供投票。accessDecisionManager根據RoleVoter,BasicAclEntryVoter投票結果,做出決策判斷。細粒度(數據級)的權限控制,SpringSecurity提供了壹種模型以及相關實現。下面我簡要說說這個模型。舉例:張三授權查詢華北區域客戶資料,李四授權查詢華南區域客戶資料。那麽,首先會對所有客戶記錄做個標示(相當於取個id),然後在acl-entry表給張三授權華北所有客戶訪問權限;給李四華南區域所有客戶權限。表記錄大致是這樣的:訪問用戶被訪問數據授權操作張三華北電力客戶1讀取張三華北電力客戶2讀取李四華南電力客戶1讀取………這個模型的缺點是非常明顯的:1.和業務數據綁定死了,業務數據的增/刪,需要維護該權限表;2.在大數據量的情況下,系統效率低下。因此,開發者需要自己書寫投票器了。我們理想中的權限管理客戶對權限管理的需求這裏是指我們服務的最終用戶,而不是軟件開發者。客戶對權限管理的需求,大體可以概括如下:1.自主靈活地管理角色、角色權限,並將角色賦予系統相關用戶;2.數據安全。系統展現數據是滿足權限的,在系統內部搜索數據也必須在相應權限訪問內,對系統數據進行增加、修改、刪除必須是滿足權限的;3.沒有功能的按鈕、菜單、數據等等,就不要在界面上出現了。開發中遇到的難點管理用戶、角色、權限,以及三者之間的關系,這種典型的RBAC模型,非常容易,沒有任何困難。困難的是,數據級權限控制。這是和業務直接掛鉤的,最復雜,而且會經常因為客戶需求表達不到位、開發人員需求理解不到位、系統框架庫表結構發生變化,而不斷變化的。這種變化,不僅需要編碼,而且還需要重新測試。甚至這種變化會波及到其他模塊,甚至整個系統。系統開發經歷幾次變化下來,代碼裏面散布著if/else,散布著sql語句。導致badsmell。我們理想的權限管理我們期望的權限管理,應該具有這麽幾個特性:1.能實現角色級權限;能實現數據級權限;2.簡單、易操作,能夠應對各種需求;3.應對需求變更能力強;4.最好有相關界面,比如權限管理界面、角色管理界面,角色和權限關系維護界面,用戶和角色關系維護界面。如果沒有界面,也是可以接受的。畢竟這些頁面需要最終用戶來使用,不同用戶對系統的界面要求不同。因此我們並不期望統壹的管理界面。SpringSecurity的評價在SpringSecurity世界裏,可以區分出哪些資源可以匿名訪問,哪些需要角色權限,又是哪個頁面提供登錄功能;怎樣進行用戶身份認證,用戶的密碼如何加密。哪些資源必須使用https協議,資源和訪問端口有怎樣的對應關系。下面就優點和缺點對SpringSecurity進行點評。優點總體說來SpringSecurity具有以下幾個優點:1.提供了壹套權限框架,這套框架是可行的;2.提供了很多用戶身份認證功能,可以節約大量開發工作;3.提供了角色判斷功能,這點既是優點又是缺點;4.提供了form-login、rememberme等控制。其中2、4兩點,對於我們中國開發者(我對國外系統不大了解),可用性並不大。我們的系統大多采用用戶名/密碼身份認證模式,大多公司都有可復用代碼。form-login、rememberme等這些功能,並不是難以開發,而且可用之處也並不多。缺點我個人認為SpringSecurity存在以下幾個硬傷:1.角色被“編碼”到配置文件和源文件,這樣最終用戶就不能創建角色了。但最終用戶期望自己來控制角色。因為在項目實施過程中,客戶可能並不能確定有哪些角色,以及角色怎麽分配給系統用戶。角色大多需要等到系統上線後,才能確定。這些編碼有:a)url的權限控制,;b)java方法的權限控制,@Secured("IS_AUTHENTICATED_ANONYMOUSLY");c)java方法的權限控制,;2.RBCA這種被廣泛運用的模型,沒有在SpringSecurity體現出來;3.SpringSecurity沒有提供好的細粒度(數據級)權限方案,提供的缺省實現維護工作量大,在大數據量情況下,幾乎不可用;4.SpringSecurity對於用戶、角色、權限之間的關系,沒有提供任何壹種維護界面。不過從SpringSecurity角度看,確實沒有必要有界面。角色創建、角色和權限直接的關系,都被“編碼”到配置文件和源文件了;5.SpringSecurity學習難度大,配置文件還是很多。我承認有很多高手,但我們也看到有很多新人加入軟件開發領域。付出如此大的學習代價,獲得這麽壹點點好處,個人覺得並不值得。附言:本人在JavaEye創建“權限管理”圈子快2周了,吸引不少網友進來。我感到很高興,也很榮幸。由於SpringSecurity運用範圍還是比較廣的,所以我打算好好學習壹下,把學習經驗和大家分享壹下。

  • 上一篇:調用源代碼越界
  • 下一篇:如何追蹤永恒之藍病毒
  • copyright 2024編程學習大全網