日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

Spring Security 是一個功能強大的框架,用于保護 Spring 應用程序。它專注于身份驗證和授權,并可根據需求進行配置和自定義。本文將討論用于身份驗證的不同組件,在實際應用中,了解身份驗證組件的概念對于使用 Spring Security 進行實現和自定義非常有幫助。

1 沒有使用 Spring Security

如果我們沒有使用 Spring Security,那么請求將被 DispatcherServlet 攔截。DispatcherServlet 是前端控制器,它攔截任何 HTTP 請求并將其轉發到正確的控制器。在 Spring Boot 中,DispatcherServlet 會被自動配置。

請求會被 DispatcherServlet 攔截

2 DispatcherServlet 是如何工作的

在深入了解 Spring Security 之前,讓我們先了解一下 DispatcherServlet 如何分發請求。當我們在一個端點(比如 /helloworld)發出請求時,前端控制器(DispatcherServlet)會如何處理它?

DispatcherServlet 創建了一個 IOC 容器,它是 Spring Framework 的核心組件之一,用于管理 bean 的創建和依賴關系。DispatcherServlet 創建的是 WebApplicationContext,這是一個專門用于 Web 應用程序的 IOC 容器。WebApplicationContext 是根據配置文件由 DispatcherServlet 進行配置的。

IOC 容器會創建控制器 bean 的實例。當請求到達時,DispatcherServlet 會使用 IOC 容器查找適當的控制器 bean,并委托給它來處理請求。

3 使用 Spring Security

當將 Spring Security 添加到 Spring Boot 應用程序中時,所有請求在到達 DispatcherServlet 和控制器之前都會被 Spring Security 機制攔截。

每當一個請求到達應用程序時,它首先被一系列過濾器攔截,這些過濾器稱為 Filter ChAIn。除了 Spring Security 提供的過濾器之外,我們還可以添加自己的自定義過濾器。認證后的 FilterChain 將請求轉發到 DisptacherServlet。

過濾器鏈攔截傳入請求

4 認證流程:步驟

身份驗證請求和響應

雖然 Spring Security 可以與不同類型的身份驗證方法一起使用,但在本文中,我們討論的是用戶名和密碼身份驗證,以便深入了解完整的身份驗證流程。

  • Filter Chain 在將請求轉發給 Dispatcher Servlet 之前攔截傳入請求。
  • 請求進入認證過濾器(其中一個過濾器是 UsernamePasswordAuthenticationFilter)。
  • 過濾器從請求(HttpServletRequest 對象)中提取用戶名和密碼。
  • 然后使用憑據創建 UsernamePasswordAuthenticationToken。
  • 調用 AuthenticationManager 的 authenticate() 方法。
  • AuthenticationManager 的 authenticate() 方法實現將嘗試使用其擁有的 AuthenticationProvider 之一進行身份驗證。
  • 如果一個身份驗證提供程序能夠成功進行身份驗證,它將返回一個包含憑據和權限的完整的 UsernamePasswordAuthenticationToken。
  • 提供程序返回的此令牌用于在 Spring Security 上下文中將用戶設置為已認證。
  • 一旦用戶通過身份驗證,請求就會被轉發到處理請求的 DispatcherServlet。

5 身份驗證流程的不同組件

我們了解一下前面部分討論的不同組件。

5.1 什么是過濾器

Spring Filter 是一個組件,可以攔截任何傳入請求,并在將其傳遞給 DispatcherServlet 之前執行某些操作。過濾器可以處理請求,然后將其轉發到 Filter Chain 中的下一個過濾器,或者可以停止并發送回 HTTP 響應。其中一個過濾器是存在于 FilterChain 中的 UsernamePasswordAuthenticationFilter。此過濾器嘗試查找 HTTP Post 請求中傳遞的用戶名和密碼,如果找到,則嘗試使用憑據對用戶進行身份驗證。以下是此類中存在的身份驗證方法的快照。

我們可以創建自己的 Filter 并將其添加到 SecurityFilterChain 中,以提供自己的邏輯來處理請求。

5.2 什么是 AuthenticationManager

AuthenticationManager 是一個接口,用于處理身份驗證的過程。它只有一個方法 authenticate(Authentication authentication),該方法將一個身份驗證對象作為參數,并返回已經認證的身份驗證對象。身份驗證對象通常是一個包含用戶名和密碼等憑據的 AuthenticationToken 對象。

Authentication authenticate(Authentication authentication) throws AuthenticationException;

AuthenticationManager 的實現類是 ProviderManager 類,它提供了 authenticate() 方法的邏輯。我們可以提供我們自己的 AuthenticationProvider 實現類或使用默認實現。

5.3 什么是 ProviderManager

該類實現了 AuthenticationManager 接口并覆蓋了 authenticate() 方法。它使用一組 AuthenticationProvider 來驗證 Authentication 對象中發送的憑據。如果 AuthenticationProvider 支持身份驗證類型,則將用于驗證用戶。如果沒有提供者支持身份驗證類型,則將拋出 AuthenticationException。

每個身份驗證提供程序的 supports() 方法用于檢查它是否可以支持所需的身份驗證類型。

5.4 什么是 AuthenticationProvider

AuthenticationProvider 是一個接口,用于定義驗證用戶的協議。它負責接收 Authentication 對象(表示用戶憑據)并返回已經認證的 Authentication 對象,如果憑據有效。如果憑據無效,則 AuthenticationProvider 應該拋出 AuthenticationException。

AuthenticationProvider 接口有兩個方法:

  • authenticate():此方法接受 Authentication 對象作為輸入,并在憑據有效時返回已認證的 Authentication 對象。如果憑據無效,則 AuthenticationProvider 應該拋出 AuthenticationException。
  • supports():此方法接受 Authentication 對象作為輸入,并且如果 AuthenticationProvider 可以驗證該對象,則返回 true。如果 AuthenticationProvider 無法驗證該對象,則應返回 false。

Spring Security 中的默認 AuthenticationProvider 是 DaoAuthenticationProvider。此提供程序使用 UserDetailsService 從數據庫加載用戶詳細信息。如果用戶憑據與數據庫中的詳細信息匹配,則 DaoAuthenticationProvider 將返回已經認證的 Authentication 對象。

我們可以添加我們自己的 AuthenticationProvider 實現來提供不同的身份驗證方法。

5.5 身份驗證和 UsernamePasswordAuthenticationToken

Authentication 和 UsernamePasswordAuthenticationToken 是什么?

  • Authentication

這是 Spring Security 中的一個接口,表示傳入身份驗證請求的令牌或已認證的主體(表示一個實體,比如個人)AuthenticationManager.authenticate() 方法。

提供的一些方法為:

Collection<? extends GrantedAuthority> getAuthorities();
 Object getCredentials();
 boolean isAuthenticated();
 void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
  • UsernamePasswordAuthenticationToken

此類擴展了 AbstractAuthenticationToken 類(身份驗證對象的基類),可用于用戶名/密碼身份驗證請求。

此類有兩個構造函數:

public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
    super((Collection)null);
    this.principal = principal;
    this.credentials = credentials;
    this.setAuthenticated(false);
}

public UsernamePasswordAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {
    super(authorities);
    this.principal = principal;
    this.credentials = credentials;
    super.setAuthenticated(true);
}

第一個構造函數可用于傳入請求以創建未經身份驗證的 Authentication 對象。

Authentication authentication = new UsernamePasswordAuthenticationToken(username,password);

第二個構造函數可用于創建完全經過身份驗證的 Authentication 對象。

Authentication authToken = new UsernamePasswordAuthenticationToken(username, password, userAuthorities);

然后,此完全經過身份驗證的 Authentication 對象從 AuthenticationProvider/AuthenticationManager 返回并表示已認證的用戶。然后將此已認證的對象設置在 SecurityContext 中。Spring Security 中的 SecurityContext 是當前執行線程的安全上下文的表示。它包含有關當前已認證用戶的信息,例如其用戶名、權限和會話信息。

6 總結

本文提供了身份驗證流程的簡要描述,以及設置身份驗證所需的不同組件。任何想要使用 Spring Security 的人在進行更多自定義和實現之前,必須清楚了解這些概念。

分享到:
標簽:Spring Security
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定