1. 程式人生 > 實用技巧 >Java Spring Security 安全框架:(三)UserDetailsService 詳解

Java Spring Security 安全框架:(三)UserDetailsService 詳解

UserDetailsService 詳解

  • 當什麼也沒有配置的時候,賬號和密碼是由 Spring Security 定義生成的。而在實際專案中賬號和密碼都是從資料庫中查詢出來的。所以我們要通過自定義邏輯控制認證邏輯。
  • 如果需要自定義邏輯時,只需要實現 UserDetailsService 介面即可。介面定義如下:
    設定

1.返回值

  • 返回值 UserDetails 是一個介面,定義如下
    設定
  • 要想返回 UserDetails 的例項就只能返回介面的實現類。Spring Security 中提供瞭如下的例項。對於我們只需要使用裡面的 User 類即可。注意 User 的全限定路徑是:
  • org.springframework.security.core.userdetails.User
  • 此處經常和系統中自己開發的 User 類弄混
    設定
  • 在 User 類中提供了很多方法和屬性。
    設定
  • 其中構造方法有兩個,呼叫其中任何一個都可以例項化 UserDetails 實現類 User 類的例項。而三個引數的構造方法實際上也是呼叫 7 個引數的構造方法
  • username:使用者名稱
  • password:密碼
  • authorities:使用者具有的許可權。此處不允許為 null
    設定
  • 此處的使用者名稱應該是客戶端傳遞過來的使用者名稱。而密碼應該是從資料庫中查詢出來的密碼。Spring Security 會根據 User 中的 password 和客戶端傳遞過來的 password 進行比較如果相同則表示認證通過,如果不相同表示認證失敗。
  • authorities 裡面的許可權對於後面學習授權是很有必要的,包含的所有內容為此使用者具有的許可權,如有裡面沒有包含某個許可權,而在做某個事情時必須包含某個許可權則會出現 403。通常都是通過 AuthorityUtils.commaSeparatedStringToAuthorityList(“”) 來建立 authorities 集合物件的。引數時一個字串,多個許可權使用逗號分隔。

2.方法引數

  • 方法引數表示使用者名稱。此值是客戶端表單傳遞過來的資料。預設情況下必須叫 username,否則無法接收。

3.異常

  • UsernameNotFoundException 使用者名稱沒有發現異常。在 loadUserByUsername 中是需要通過自己的邏輯從資料庫中取值的。如果通過使用者名稱沒有查詢到對應的資料,應該丟擲 UsernameNotFoundException,系統就知道使用者名稱沒有查詢到。