天天看點

【Spring Security】基本原理Spring Security 原理

文章目錄

  • Spring Security 原理
    • 一、權限管理中的相關概念
    • 二、Spring Security 基本原理
      • 1.FilterSecurityInterceptor
      • 2.ExceptionTranslationFilter
      • 3.UsernamePasswordAuthenticationFilter
    • 三、UserDetailsService 接口講解
    • 四、PasswordEncoder 接口講解
    • 總結

Spring Security 原理

一、權限管理中的相關概念

1、主體 英文單詞:principal

使用系統的使用者或裝置或從其他系統遠端登入的使用者等等。簡單說就是誰使用系 統誰就是主體。

2、認證 英文單詞:authentication

權限管理系統确認一個主體的身份,允許主體進入系統。簡單說就是“主體”證 明自己是誰。 籠統的認為就是以前所做的登入操作。

3、授權 英文單詞:authorization

将作業系統的 “權力” “授予” “主體”,這樣主體就具備了作業系統中特定功 能的能力。

  • 是以簡單來說,授權就是給使用者配置設定權限。

傳回頂部

二、Spring Security 基本原理

SpringSecurity 本質是一個過濾器鍊: 啟動時可以擷取到過濾器鍊。

org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFil ter org.springframework.security.web.context.SecurityContextPersistenceFilter org.springframework.security.web.header.HeaderWriterFilter org.springframework.security.web.csrf.CsrfFilter org.springframework.security.web.authentication.logout.LogoutFilter org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter org.springframework.security.web.savedrequest.RequestCacheAwareFilter org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter org.springframework.security.web.authentication.AnonymousAuthenticationFilter org.springframework.security.web.session.SessionManagementFilter org.springframework.security.web.access.ExceptionTranslationFilter org.springframework.security.web.access.intercept.FilterSecurityInterceptor

傳回頂部

1.FilterSecurityInterceptor

  • FilterSecurityInterceptor

    :是一個方法級的權限過濾器, 基本位于過濾鍊的最底部。
  • 【Spring Security】基本原理Spring Security 原理
  • super.beforeInvocation(fi) 表示檢視之前的 filter 是否通過。
  • fi.getChain().doFilter(fi.getRequest(), fi.getResponse());表示真正的調用背景的服務。
FilterSecurityInterceptor過濾器首先看之前的過濾器是否放行,若放行,執行目前的過濾器~

2.ExceptionTranslationFilter

  • ExceptionTranslationFilter

    :是個異常過濾器,用來處理在認證授權過程中抛出的異常
  • 【Spring Security】基本原理Spring Security 原理

傳回頂部

3.UsernamePasswordAuthenticationFilter

  • UsernamePasswordAuthenticationFilter

    :對

    /login

    的 POST 請求做攔截,校驗表單中使用者名、密碼。
  • 【Spring Security】基本原理Spring Security 原理

傳回頂部

三、UserDetailsService 接口講解

當什麼也沒有配置的時候,賬号和密碼是由 Spring Security 定義生成的。而在實際項目中 賬号和密碼都是從資料庫中查詢出來的。 是以我們要通過自定義邏輯控制認證邏輯。 如果需要自定義邏輯時,隻需要實作 UserDetailsService 接口即可。

接口定義如下:

【Spring Security】基本原理Spring Security 原理

**傳回值 UserDetails對象, 這個類是系統預設的使用者“主體”: **

【Spring Security】基本原理Spring Security 原理
// 表示擷取登入使用者所有權限 
Collection getAuthorities();

// 表示擷取密碼 
String getPassword(); 

// 表示擷取使用者名 
String getUsername(); 

// 表示判斷賬戶是否過期 
boolean isAccountNonExpired(); 

// 表示判斷賬戶是否被鎖定 
boolean isAccountNonLocked(); 

// 表示憑證{密碼}是否過期 
boolean isCredentialsNonExpired(); 

// 表示目前使用者是否可用 
boolean isEnabled();  
           

以下是 UserDetails 實作類 User:

【Spring Security】基本原理Spring Security 原理

以後我們隻需要使用 User 這個實體類即可!!!

整體感覺:

【Spring Security】基本原理Spring Security 原理

傳回頂部

四、PasswordEncoder 接口講解

【Spring Security】基本原理Spring Security 原理
// 表示把參數按照特定的解析規則進行解析
String encode(CharSequence rawPassword);

/* 表示驗證從存儲中擷取的編碼密碼與編碼後送出的原始密碼是否比對。如果密碼匹
配,則傳回 true;如果不比對,則傳回 false。第一個參數表示需要被解析的密碼。第二個
參數表示存儲的密碼。*/
boolean matches(CharSequence rawPassword, String encodedPassword);

/* 表示如果解析的密碼能夠再次進行解析且達到更安全的結果則傳回 true,否則傳回
false。預設傳回 false。*/
default boolean upgradeEncoding(String encodedPassword) {
	return false;
}
           

BCryptPasswordEncoder 是 Spring Security 官方推薦的密碼解析器,平時多使用這個解析 器。

BCryptPasswordEncoder 是對 bcrypt 強散列方法的具體實作。是基于 Hash 算法實作的單 向加密。可以通過 strength 控制加密強度,預設 10.

測試:

public class PWDEncoderTest {

    public static void test01() {
        // 建立密碼解析器
        BCryptPasswordEncoder bCryptPasswordEncoder = new
                BCryptPasswordEncoder();
        // 對密碼進行加密
        String number = bCryptPasswordEncoder.encode("123456");
        // 列印加密之後的資料
        System.out.println("加密之後資料:\t" + number);
        //判斷原字元加密後和加密之前是否比對
        boolean result1 = bCryptPasswordEncoder.matches("1234", number);
        boolean result2 = bCryptPasswordEncoder.matches("123456", number);
        // 列印比較結果
        System.out.println("比較結果:\t" + result1 + "\t" + result2);
    }

    public static void main(String[] args) {
        test01();
    }

}
           
【Spring Security】基本原理Spring Security 原理

整體感覺:

【Spring Security】基本原理Spring Security 原理

傳回頂部

總結

【Spring Security】基本原理Spring Security 原理

參考:https://www.bilibili.com/video/BV15a411A7kP?p=4

繼續閱讀