Spring Security 入門之基本概念

  • 2019 年 11 月 5 日
  • 筆記

一、Authentication 簡介

1.1 定義

認證(Authentication)是證明用戶身份的過程,是為了解決 「Who are you?」 的問題,即在應用中誰能證明他就是他本人。使用特定系統時,身份驗證是必不可少的機制。沒有正確的身份驗證就很難識別用戶。在認證過程中,一般需要認證者提供與他們身份信息相關的一些標識信息來表明他就是他本人,如提供身份證,用戶名/密碼來證明。

(圖片來源 —— https://www.ilantus.com/blog/authentication-vs-authorization-whats-the-difference/)

1.2 示例

例如,有一個發送方 A 通過互聯網向接收方 B 發送電子文檔。系統將如何識別發送方 A 已發送給接收方 B 的專用消息。入侵者 C 可能會攔截,修改和重播文檔以欺騙或竊取此類攻擊,這些信息被稱為偽造

在給定情況下,身份驗證機制可確保兩件事:首先,它確保發送者和接收者都是合法的人,這就是所謂的數據來源身份驗證。其次,它藉助私密會話密鑰確保了發送者和接收者之間已建立的連接的安全性,從而無法推斷出該連接,這被稱為對等實體身份驗證

二、Authorization 簡介

2.1 定義

授權技術用於確定授予已認證用戶的權限。簡而言之,它檢查是否允許用戶訪問特定資源。授權發生在身份驗證之後,在此之前先確定用戶的身份,然後通過查找存儲在表和數據庫中的條目來確定用戶的訪問列表。

2.2 示例

例如,用戶 A 希望訪問服務器上特定的資源文件。首先用戶 A 將向服務器發送請求,接收到用戶 A 的請求之後,服務器會先驗證用戶 A 的身份。若用戶 A 通過身份驗證,之後服務器將找到用戶 A 所具有的相應權限,判斷用戶 A 是否有訪問所請求資源文件的權限。一般情況下,資源的訪問權限可以包括查看,修改或刪除等。

(圖片來源 —— https://www.ilantus.com/blog/authentication-vs-authorization-whats-the-difference/)

三、Authentication 與 Authorization 的區別

前面我們已經介紹了認證和授權的定義,下面我們來看一下它們之間的主要區別。

3.1 身份認證和授權之間的主要區別

  • 主要焦點:身份認證是檢查一個人的詳細信息以識別他,而授權檢查一個用戶的訪問資源的權限。
  • 主要過程:身份認證將驗證用戶的憑據,而授權將驗證用戶的權限。
  • 程序順序:首先進行身份認證,然後在身份認證之後進行授權。
  • 應用領域:學生可以在訪問大學的學習管理系統之前進行身份驗證。他可以根據授予他的權限訪問課程的幻燈片和其他學習資源。

(圖片來源 —— https://techdifferences.com/difference-between-authentication-and-authorization.html)

3.2 小結

身份認證和授權是確保系統信息安全的兩種機制。身份認證和授權之間的區別在於,身份認證是檢查用戶詳細信息以識別其授予系統訪問權限的過程,而授權則是檢查經過身份驗證的用戶訪問系統資源的特權或權限的過程。

四、其它概念

Principal

身份(Principal),即主體的標識屬性,可以是任何東西,如用戶名、郵箱等,唯一即可。一個主體可以有多個principal,但只有一個 Primary principal,一般是用戶名/密碼/手機號。

GrantedAuthority

在 Spring Security 中,我們可以將每個 GrantedAuthority 視為一個單獨的特權。比如 READ_AUTHORITYWRITE_PRIVILEGE 甚至 CAN_EXECUTE_AS_ROOT。

當直接使用 GrantedAuthority 時,例如通過使用諸如 hasAuthority('READ_AUTHORITY') 之類的表達式我們將以細粒度的方式限制訪問

@Override  protected void configure(HttpSecurity http) throws Exception {      .antMatchers("/protectedbyauthority").hasAuthority("READ_PRIVILEGE")  }

Role

類似地,在 Spring Security 中,我們可以將每個 Role 視為一個粗粒度的 GrantedAuthority ,此種 GrantedAuthority 以 ROLE 為前綴的字符串表示。當直接使用 Role 時,可使用 hasRole("ADMIN") 之類的表達式,我們將以粗粒度方式限制訪問。值得注意的是,默認的 「ROLE」 前綴是可配置的。

@Override  protected void configure(HttpSecurity http) throws Exception {      .antMatchers("/protectedbyrole").hasRole("USER")  }

五、參考資源

  • Techdifferences —— Difference Between Authentication and Authorization
  • Pediaa —— Difference Between Authentication and Authorization
  • Ilantus —— Authentication Vs Authorization- What』s The Difference?