1. 程式人生 > >spring security原理-學習筆記1-整體概覽

spring security原理-學習筆記1-整體概覽

整體概述

執行時環境

Spring Security 3.0需要Java 5.0 Runtime Environment或更高版本。

核心元件

SecurityContextHolder,SecurityContext和Authentication Objects

最基本的物件是SecurityContextHolder。這是我們儲存應用程式當前安全上下文的詳細資訊的地方,其中包括當前使用該應用程式的主體的詳細資訊。預設情況下,SecurityContextHolder使用ThreadLocal來儲存這些詳細資訊,這意味著安全上下文始終可用於同一執行執行緒中的方法,即使安全上下文未作為引數顯式傳遞那些方法。如果在處理當前委託人的請求之後小心地清除執行緒,以這種方式使用ThreadLocal是非常安全的。當然,Spring Security會自動為您解決這個問題,因此無需擔心。

獲取有關當前使用者的資訊

在SecurityContextHolder內,我們儲存了當前與應用程式互動的主體的詳細資訊。Spring Security使用Authentication物件來表示此資訊。您通常不需要自己建立Authentication物件,但使用者查詢Authentication物件是相當常見的。您可以使用以下程式碼塊(從應用程式的任何位置)獲取當前經過身份驗證的使用者的名稱

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

if (principal instanceof UserDetails) {
String username = ((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}

UserDetailsS​​ervice

用來查詢資料庫,載入使用者資訊的介面
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

需要注意

UserDetailsService經常有些混亂。它純粹是使用者資料的DAO,除了將資料提供給框架內的其他元件之外,不執行任何其他功能。特別是,它不會對使用者進行身份驗證,這是由AuthenticationManager完成的。在許多情況下,如果您需要自定義身份驗證過程,直接實現AuthenticationProvider會更有意義。

GrantedAuthority

除了校長之外,Authentication提供的另一個重要方法是getAuthorities()。此方法提供GrantedAuthority個物件的陣列。毫不奇怪,GrantedAuthority是授予校長的權力。這些權力通常是“角色”,例如ROLE_ADMINISTRATOR或ROLE_HR_SUPERVISOR。稍後將為web授權,方法授權和域物件授權配置這些角色。Spring Security的其他部分能夠解釋這些權威,並期望它們存在。GrantedAuthority物件通常由UserDetailsService載入。

小結

回顧一下,到目前為止我們看到的Spring Security的主要構建塊是:

SecurityContextHolder,提供SecurityContext的訪問許可權。
SecurityContext,儲存Authentication和可能的特定於請求的安全資訊。
Authentication,以特定於Spring Security的方式代表校長。
GrantedAuthority,以反映授予主體的應用程式範圍的許可權。
UserDetails,提供從應用程式的DAO或其他安全資料來源構建Authentication物件所需的資訊。
UserDetailsService,在基於String的使用者名稱(或證書ID等)中傳遞時建立UserDetails。

認證Authentication

在Spring Security內認證的流程。

  1. 獲取使用者名稱和密碼並將其合併到UsernamePasswordAuthenticationToken的例項中(我們之前看到的Authentication介面的例項)。
  2. 令牌被傳遞給AuthenticationManager的例項以進行驗證。
  3. AuthenticationManager在成功驗證後返回完全填充的Authentication例項。
  4. 通過呼叫SecurityContextHolder.getContext().setAuthentication(…​)建立安全上下文,傳入返回的身份驗證物件。

例子:

程式碼:

https://github.com/victorsheng/gs-securing-web/blob/master/complete/src/test/java/helloworld/AuthenticationExample.java

結果

Please enter your username:
hi
Please enter your password:
hi1
Authentication failed: Bad Credentials
Please enter your username:
hi
Please enter your password:
hi
Successfully authenticated. Security context contains: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@441d0230: Principal: hi; Credentials: [PROTECTED]; Authenticated: true; Details: null; Granted Authorities: ROLE_USER

web應用中的驗證 Authentication in a Web Application

考慮典型的web應用程式的身份驗證過程:

  1. 您訪問主頁,然後單擊連結。
  2. 請求轉到伺服器,伺服器確定您已請求受保護的資源。
  3. 由於您目前尚未通過身份驗證,因此伺服器會發回一個響應,指示您必須進行身份驗證。響應將是HTTP響應程式碼,或重定向到特定的web頁面。
  4. 根據身份驗證機制,您的瀏覽器將重定向到特定的web頁面,以便您可以填寫表單,或者瀏覽器將以某種方式檢索您的身份(通過BASIC身份驗證對話方塊,cookie,X. 509證書等)。
  5. 瀏覽器將向伺服器發回響應。這將是包含您填寫的表單內容的HTTP POST,或者包含您的身份驗證詳細資訊的HTTP標頭。
  6. 接下來,伺服器將決定所呈現的憑證是否有效。如果它們有效,則下一步將會發生。如果它們無效,通常會要求您的瀏覽器再次嘗試(因此您將返回上面的第二步)。
  7. 將重試您進行身份驗證過程的原始請求。希望您已通過足夠授權的許可權進行身份驗證以訪問受保護資源。如果您有足夠的訪問許可權,請求將成功。否則,您將收到HTTP錯誤程式碼403,這意味著“禁止”。

ExceptionTranslationFilter

ExceptionTranslationFilter是一個Spring Security過濾器,負責檢測丟擲的任何Spring Security異常。AbstractSecurityInterceptor通常會丟擲此類異常,這是授權服務的主要提供者。

AuthenticationEntryPoint

AuthenticationEntryPoint負責上面列表中的第三步。可以想象,每個web應用程式都有一個預設的身份驗證策略(好吧,這可以像Spring Security中的幾乎所有其他配置一樣配置,但現在讓我們保持簡單)。每個主要身份驗證系統都有自己的AuthenticationEntryPoint實現,通常執行步驟3中描述的操作之一。

在請求之間SecurityContext

在Spring Security中,在請求之間儲存SecurityContext的責任落在SecurityContextPersistenceFilter上,預設情況下,該上下文將上下文儲存為HTTP請求之間的HttpSession屬性。
許多其他型別的應用程式(例如,無狀態RESTful web服務)不使用HTTP會話,並將在每個請求上重新進行身份驗證。但是,鏈中包含SecurityContextPersistenceFilter以確保在每次請求後清除SecurityContextHolder仍然很重要。

授權/訪問控制 Access-Control (Authorization) in Spring Security

負責在Spring Security中做出訪問控制決策的主介面是AccessDecisionManager。它有一個decide方法,它接受一個代表請求訪問的主體的Authentication物件,一個“安全物件”(見下文)和一個適用於該物件的安全元資料屬性列表(例如角色列表)這是獲得訪問所必需的。

aop

可以選擇使用AspectJ或Spring AOP執行方法授權,也可以選擇使用過濾器執行web請求授權。您可以將這些方法中的零個,一個,兩個或三個一起使用。主流使用模式是執行一些web請求授權,以及服務層上的一些Spring AOP方法呼叫授權。

AbstractSecurityInterceptor

AbstractSecurityInterceptor為處理安全物件請求提供了一致的工作流程,通常:

  1. 查詢與當前請求關聯的“配置屬性”
  2. 將安全物件,當前Authentication和配置屬性提交到AccessDecisionManager以進行授權決策
  3. (可選)更改發生呼叫的Authentication
  4. 允許安全物件呼叫繼續(假設已授予訪問許可權)
  5. 呼叫返回後,呼叫AfterInvocationManager(如果已配置)。如果呼叫引發異常,則不會呼叫AfterInvocationManager。

Configuration Attributes

RunAsManager

AfterInvocationManager

Security interceptors and the "secure object" model

本地化

參考

英文版文件
https://docs.spring.io/spring-security/site/docs/5.0.5.RELEASE/reference/htmlsingle/#overall-architecture
中文版文件
https://www.springcloud.cc/spring-security.html