SpringSecurity介紹


Spring Security 簡介

  Spring 是一個非常流行和成功的java應用開發框架。 

  Spring Security 基於Spring 框架,提供了一套web應用安全性的完整解決方案。

  一般來說,Web 應用的安全性包括兩部分:

    1. 用戶認證(Authentication)

      用戶認證指的是驗證某個用戶是否為系統中的合法主體,也就是說用戶能否訪問該系統。用戶認證一般要求用戶提供用戶名和密碼。系統通過校驗用戶名和密碼來完成認證過程。

    2. 用戶授權(Authorization)

      用戶授權指的是驗證某個用戶是否有權限執行某個操作。在一個系統中,不同用戶所具有的權限是不同的。比如對一個文件來說,有的用戶只能進行讀取,而有的用戶可以進行修改。

      一般來說,系統會為不同的用戶分配不同的角色,而每個角色則對應一系列的權限

  對於上面提到的兩種應用情景,Spring Security 框架都有很好的支持。

  在用戶認證方面,Spring Security 框架支持主流的認證方式,包括 HTTP 基本認證、HTTP 表單驗證、HTTP 摘要認證、OpenID 和 LDAP 等。

  在用戶授權方面,Spring Security 提供了基於角色的訪問控制和訪問控制列表(Access Control List,ACL),可以對應用中的領域對象進行細粒度的控制。

Security 原理分析

SpringSecurity 過濾器鏈

  SpringSecurity 采用的是責任鏈的設計模式,它有一條很長的過濾器鏈。現在對這條過濾器鏈的各個進行說明:

  1. WebAsyncManagerIntegrationFilter: 將Security上下文與Spring Web 中用於處理異步請求映射的WebAsyncManager進行集成。
  2. SecurityContextPersistenceFilter在每次請求處理之前將該請求相關的安全上下文信息加載到 SecurityContextHolder 中,然后在該次請求處理完成之后,將 SecurityContextHolder 中關於這次請求的信息存儲到一個“倉儲”中,然后將 SecurityContextHolder 中的信息清除,例如在Session中維護一個用戶的安全信息就是這個過濾器處理的。
  3. HeaderWriterFilter用於將頭信息加入響應中。
  4. CsrfFilter用於處理跨站請求偽造。
  5. LogoutFilter用於處理退出登錄。
  6. UsernamePasswordAuthenticationFilter用於處理基於表單的登錄請求,從表單中獲取用戶名和密碼。默認情況下處理來自 /login 的請求。從表單中獲取用戶名和密碼時,默認使用的表單 name 值為 username 和 password,這兩個值可以通過設置這個過濾器的usernameParameter 和 passwordParameter 兩個參數的值進行修改。

  7. DefaultLoginPageGeneratingFilter如果沒有配置登錄頁面,那系統初始化時就會配置這個過濾器,並且用於在需要進行登錄時生成一個登錄表單頁面。
  8. BasicAuthenticationFilter檢測和處理 http basic 認證。
  9. RequestCacheAwareFilter用來處理請求的緩存。
  10. SecurityContextHolderAwareRequestFilter主要是包裝請求對象request。
  11. AnonymousAuthenticationFilter檢測 SecurityContextHolder 中是否存在 Authentication 對象,如果不存在為其提供一個匿名 Authentication。
  12. SessionManagementFilter管理 session 的過濾器
  13. ExceptionTranslationFilter處理 AccessDeniedException 和 AuthenticationException 異常
  14. FilterSecurityInterceptor可以看做過濾器鏈的出口。
  15. RememberMeAuthenticationFilter當用戶沒有登錄而直接訪問資源時, 從 cookie 里找出用戶的信息, 如果 Spring Security 能夠識別出用戶提供的remember me cookie, 用戶將不必填寫用戶名和密碼, 而是直接登錄進入系統,該過濾器默認不開啟。

流程說明

  1. 客戶端發起一個請求,進入 Security 過濾器鏈。
  2. 當到 LogoutFilter 的時候判斷是否是登出路徑,如果是登出路徑則到 logoutHandler ,如果登出成功則到 logoutSuccessHandler 登出成功處理,如果登出失敗則由 ExceptionTranslationFilter ;如果不是登出路徑則直接進入下一個過濾器。
  3. 當到 UsernamePasswordAuthenticationFilter 的時候判斷是否為登錄路徑,如果是,則進入該過濾器進行登錄操作,如果登錄失敗則到 AuthenticationFailureHandler 登錄失敗處理器處理,如果登錄成功則到 AuthenticationSuccessHandler 登錄成功處理器處理,如果不是登錄請求則不進入該過濾器。
  4. 當到 FilterSecurityInterceptor 的時候會拿到 uri ,根據 uri 去找對應的鑒權管理器,鑒權管理器做鑒權工作,鑒權成功則到 Controller 層否則到 AccessDeniedHandler 鑒權失敗處理器處理。

SpringSecurity 核心組件

  1. SecurityContextHolder提供對SecurityContext的訪問
  2. SecurityContext,:持有Authentication對象和其他可能需要的信息
  3. AuthenticationManager其中可以包含多個AuthenticationProvider
  4. ProviderManager:對象為AuthenticationManager接口的實現類
  5. AuthenticationProvider :主要用來進行認證操作的類 調用其中的authenticate()方法去進行認證操作
  6. Authentication:Spring Security方式的認證主體
  7. GrantedAuthority對認證主題的應用層面的授權,含當前用戶的權限信息,通常使用角色表示
  8. UserDetails構建Authentication對象必須的信息,可以自定義,可能需要訪問DB得到
  9. UserDetailsService通過username構建UserDetails對象,通過loadUserByUsername根據userName獲取UserDetail對象 (可以在這里基於自身業務進行自定義的實現  如通過數據庫,xml,緩存獲取等) 

 


UserDetails和UserDetailsService介紹

  大多數的身份驗證程序都利用UserDetails和UserDetailsService接口,身份認證最常用的方法是加載相應的UserDetails並檢查加載的密碼和用戶輸入的密碼。

//UserDetails 
public interface UserDetails extends Serializable {
  // 獲取用戶權限信息 Collection
<? extends GrantedAuthority> getAuthorities();   // 獲取用戶密碼 String getPassword();   //獲取用戶名稱 String getUsername();   // 用戶是否沒有過期 true:沒有過期 boolean isAccountNonExpired();   //用戶是否鎖定 boolean isAccountNonLocked();   // 用戶密碼是否過期 boolean isCredentialsNonExpired();   // 用戶是否可用 boolean isEnabled(); } //UserDetailsService public interface UserDetailsService { UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException; }

UserDetails接口:Spring Security的基礎接口,包含了用戶的賬號、密碼、狀態(是否鎖定)、權限等信息。

UserDetailsService接口:提供了給用戶獲取信息的方法,所以它就定義了一個接口,然后由你去實現它,在Spring Security快加里提供的UserDetailsService接口默認實現了:

  • 內存身份驗證(InMemoryDaoImpl):存儲於內存空間
  • JdbcDaoImpl:存儲於數據庫(磁盤上)

總結:簡單來說,UserDetailService只單純地負責存取用戶信息,除了給框架內的其他組件提供數據外沒有其他功能。而認證過程是由AuthenticationManager來完成的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM