spring-security上手筆記
不安全隱患
>缺少URL保護和統一的認證造成的許可權擴散
>授權不合理甚至缺失;
>資料庫認證資訊不安全且很容易獲取
>個人的識別資訊和敏感資料很容易獲取或沒有加密
>不安全的傳輸層保護,沒有使用SSL加密
1)認證: 識別系統中的某一個使用者,並將其與一個可信任的(安全的)實體關聯;
2)授權:保證授權過的使用者能夠給功能和資料進行恰當的訪問;
3)資料庫認證資訊不安全很容易獲取:
4)敏感資訊:如信用卡號等等;
5)資料傳輸層保護:
安全是一個元件
一些術語
認證:鑑別我們應用中的使用者是他們所宣告的那個人。
principal:已認證安全實體,用來唯一標識一個認證過的實體。大多數情況下,一個principal只是簡單地代表一個使用者user。
授權:涉及2個方面:a)已認證的安全實體與一個或多個許可權的匹配關係;b)分配 許可權檢查 給 系統中要進行安全保護的資源。
擴充套件和配置
>如何擴充套件和配置spring security來滿足需求。Spring Security有強大的基礎配置功能以及內建的認證功能。
1)Spring Security的xml配置檔案:描述所有需要用到的spring security元件,這些元件將會控制標準的web請求;SecurityNamespaceHandler
2)web.xml裡新增DelegatingFilterProxy,攔截servletRequest請求
整體流程
過濾鏈
Spring Security使用過濾器鏈的概念並實現了自己的抽象,提供了VirtualFilterChain,可以根據Spring Security XML配置檔案中設定的URL模式動態地建立過濾器鏈。過濾鏈的名稱:預設是DelegatingFilterProxy配置的filter-name,或者特別配置beanName
Spring Security擁有總共大約25個過濾器。過濾鏈的配置通過<http>
o.s.s.web.context.SecurityContextPersistenceFilter |
負責從SecurityContextRepository獲取或儲存SecurityContext。SecurityContext代表使用者安全和認證過的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 |
監控一個基於form或OpenId認證的URL(預設為/spring_security_login),並生成展示登陸form的HTML |
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
使用order排序
認證
有兩個重要介面的實現是在認證鏈中被這些參與的類初始化的,它們用來封裝一個認證過(或還沒有認證過的)的使用者的詳細資訊和許可權:
1)o.s.s.core.Authentication:儲存使用者的詳細資訊,包括唯一標識(如使用者名稱)、憑證資訊(如密碼)以及本使用者被授予的一個或多個許可權(o.s.s.core.GrantedAuthority)。開發人員通常會使用Authentication物件來獲取使用者的詳細資訊,或者使用自定義的認證實現以便在Authentication物件中增加應用依賴的額外資訊。
異常
授權
投票器(voter)是在授權過程中的一個重要角色,它的作用是評估以下的內容:
l 要訪問受保護資源的請求所對應上下文(如URL請求的IP地址);
l 使用者的憑證資訊(如果存在的話);
l 要試圖訪問的受保護資源;
l 系統的配置以及要訪問資源本身的配置引數。請求資源的“訪問宣告資訊”。
實際上Spring Security允許通過security名稱空間來配置AccessDecisionManager。<http>元素的access-decision-manager-ref屬性來指明一個實現了AccessDecisionManager的Spring Bean。
登入-退出
登入
1)配置form-login login-page遮蔽掉DefaultLoginPageGeneratingFilter;
2)去掉登入頁的許可權驗證過濾:
退出
remember me
Remember me功能設定了一個cookie在使用者的瀏覽器上,它包含一個Base64編碼的字串,包含以下內容:
l 使用者的名字;
l 過期的日期/時間;
l 一個MD5的雜湊值包括過期日期/時間、使用者名稱和密碼;
l 應用的key值,是在<remember-me>元素的key屬性中定義的。
這些內容將被組合成一個cookie的值儲存在瀏覽器中以備後用。
RememberMeAuthenticationFilter在過濾器鏈中,位於SecurityContextHolderAwareRequestFilter之後,而在AnonymousProcessingFilter之前。
轉載於:https://my.oschina.net/braveCS/blog/549387