1. 程式人生 > 實用技巧 >spring-security上手筆記

spring-security上手筆記

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

不安全隱患

>缺少URL保護和統一的認證造成的許可權擴散

>授權不合理甚至缺失;

>資料庫認證資訊不安全且很容易獲取

>個人的識別資訊和敏感資料很容易獲取或沒有加密

>不安全的傳輸層保護,沒有使用SSL加密

1)認證: 識別系統中的某一個使用者,並將其與一個可信任的(安全的)實體關聯;

2)授權:保證授權過的使用者能夠給功能和資料進行恰當的訪問;

3)資料庫認證資訊不安全很容易獲取:

4)敏感資訊:如信用卡號等等;

5)資料傳輸層保護:

安全是一個元件

一些術語

認證:鑑別我們應用中的使用者是他們所宣告的那個人。

principal:已認證安全實體,用來唯一標識一個認證過的實體。大多數情況下,一個principal只是簡單地代表一個使用者user

授權:涉及2個方面:a)已認證的安全實體與一個或多個許可權的匹配關係;b)分配 許可權檢查 系統中要進行安全保護的資源。

擴充套件和配置

>如何擴充套件和配置spring security來滿足需求。Spring Security有強大的基礎配置功能以及內建的認證功能。

1)Spring Securityxml配置檔案:描述所有需要用到的spring security元件,這些元件將會控制標準的web請求;SecurityNamespaceHandler

解析Spring Securityxml配置檔案

2)web.xml裡新增DelegatingFilterProxy,攔截servletRequest請求

075335_nWSU_229733.png

075335_AzQR_229733.png

整體流程

過濾鏈

075335_cHdz_229733.png

Spring Security使用過濾器鏈的概念並實現了自己的抽象,提供了VirtualFilterChain,可以根據Spring Security XML配置檔案中設定的URL模式動態地建立過濾器鏈。過濾鏈的名稱:預設是DelegatingFilterProxy配置的filter-name,或者特別配置beanName

075335_OOYy_229733.png

Spring Security擁有總共大約25個過濾器。過濾鏈的配置通過<http>

元素實現。其中自動配置auto-config的選項會自動新增10Spring Secutiry的過濾器:順序如下:

o.s.s.web.context.SecurityContextPersistenceFilter

075335_ucBp_229733.png

負責從SecurityContextRepository獲取或儲存SecurityContextSecurityContext代表使用者安全和認證過的session

http://dead-knight.iteye.com/blog/1513086

使用memcache儲存,可以分散式。

預設通過session獲取,多個應用同一個域名被坑。

o.s.s.web.authentication.logout.LogoutFilter

退出

監控一個實際為退出功能的URL(預設為/j_spring_security_logout),並在匹配時完成使用者的退出功能

o.s.sweb.authentication.UsernamePasswordAuthenticationFileter

使用<http><form-login>子元素配置

form登入認證

監控一個使用使用者名稱和密碼基於form認證的URL(預設為/j_spring_security_check),並在URL匹配時嘗試認證使用者

o.s.s.webauthentication.ui.DefaultLoginPageGeneratingFilter

監控一個基於formOpenId認證的URL(預設為/spring_security_login),並生成展示登陸formHTML

o.s.s.web.authentication.www.BasicAuthenticationFilter

HTTP基本認證

監控HTTP基礎認證的頭資訊並進行處理

o.s.s.web.saverequest.RequestCacheAwareFilter

使用者使用者登入成功後,重新恢復因為登陸被打斷的請求

o.s.s.web.servletapi.SecurityContextHolderAwareRequestFilter

用一個擴充套件了HttpServletRequestWrapper的子類o.s.s.web.servletapi.SecurityContextHolderAwareRequestWrapper包裝HttpServletRequest。它為請求處理器提供了額外的上下文資訊。

o.s.s.web.authentication.AnonumousAuthenticationFilter

如果使用者到這一步還沒經過認證,將會為這個請求關聯一個認證的token,標識此使用者是匿名的。

o.s.s.web.session.SessionManagementFilter

根據認證的安全實體資訊跟蹤session,保證所有關聯一個安全實體的session都能被跟蹤到。session固化

o.s.s.web.access.ExceptionTranslationFilter

解決在處理一個請求時產生的指定異常

o.s.s.web.access.intercept.FilterSecurityInterceptor

簡化授權和訪問控制決定,委託一個AccessDecisionManager完成授權的判斷。

org.springframework.security.config.http.HttpSecurityBeanDefinitionParser

075335_lq8O_229733.png

075335_TD4i_229733.png

075336_2Abv_229733.png

075336_3jEg_229733.png

075336_bw3l_229733.png

075336_xHRq_229733.png

使用order排序

075336_2Y7U_229733.png

認證

075336_JIy0_229733.png

075336_UwtE_229733.png

075337_rkqt_229733.png

有兩個重要介面的實現是在認證鏈中被這些參與的類初始化的,它們用來封裝一個認證過(或還沒有認證過的)的使用者的詳細資訊和許可權:

1)o.s.s.core.Authentication儲存使用者的詳細資訊,包括唯一標識(如使用者名稱)、憑證資訊(如密碼)以及本使用者被授予的一個或多個許可權(o.s.s.core.GrantedAuthority)。開發人員通常會使用Authentication物件來獲取使用者的詳細資訊,或者使用自定義的認證實現以便在Authentication物件中增加應用依賴的額外資訊。

075337_rXYQ_229733.png 075337_KUJM_229733.png

075337_gh99_229733.png

075337_bOfN_229733.png

075338_MQXZ_229733.png

異常

075338_0coP_229733.png

授權

075338_TjQa_229733.png

075338_2Prh_229733.png

投票器(voter)是在授權過程中的一個重要角色,它的作用是評估以下的內容:

l 要訪問受保護資源的請求所對應上下文(如URL請求的IP地址);

l 使用者的憑證資訊(如果存在的話);

l 要試圖訪問的受保護資源;

l 系統的配置以及要訪問資源本身的配置引數。請求資源的“訪問宣告資訊”。

075338_ddtS_229733.png

實際上Spring Security允許通過security名稱空間來配置AccessDecisionManager<http>元素的access-decision-manager-ref屬性來指明一個實現了AccessDecisionManagerSpring Bean

075338_A2KR_229733.png

075339_UXIk_229733.png

登入-退出

登入

075339_HlPG_229733.png

1)配置form-login login-page遮蔽掉DefaultLoginPageGeneratingFilter

075339_PfVc_229733.png

2)去掉登入頁的許可權驗證過濾:

075339_4ZDP_229733.png

退出

075339_ot60_229733.png

075339_5h8U_229733.png

075340_9bZ4_229733.png

075812_TMGF_229733.pngremember me

Remember me功能設定了一個cookie在使用者的瀏覽器上,它包含一個Base64編碼的字串,包含以下內容:

l 使用者的名字;

l 過期的日期/時間;

l 一個MD5的雜湊值包括過期日期/時間、使用者名稱和密碼;

l 應用的key值,是在<remember-me>元素的key屬性中定義的。

這些內容將被組合成一個cookie的值儲存在瀏覽器中以備後用。

RememberMeAuthenticationFilter在過濾器鏈中,位於SecurityContextHolderAwareRequestFilter之後,而在AnonymousProcessingFilter之前。

075812_ado3_229733.png

075812_gEcb_229733.png

075813_viAR_229733.png

轉載於:https://my.oschina.net/braveCS/blog/549387