UserDetails
UserDetails 由 UserDetailsService 返回。 DaoAuthenticationProvider 驗證 UserDetails,然後返回一個 Authentication,其主體是配置的 UserDetailsService 返回的 UserDetails。
憑證管理
強烈建議在儲存使用者憑證的類中(例如繼承或實現 UserDetails 的類)實現 CredentialsContainer 介面,尤其是在不快取使用者詳細資訊的應用程式中。這種做法透過確保敏感資料(如密碼)不會在記憶體中保留超過必要的時間來增強安全性。
|
在快取使用者詳細資訊的情況下,可以考慮建立 |
何時實現 CredentialsContainer
不使用 UserDetails 快取機制的應用程式應特別考慮實現 CredentialsContainer。這種方法有助於降低敏感資訊在記憶體中保留的風險,這些資訊可能容易受到記憶體轉儲等攻擊向量的攻擊。
public class MyUserDetails implements UserDetails, CredentialsContainer {
private String username;
private String password;
// UserDetails implementation...
@Override
public void eraseCredentials() {
this.password = null; // Securely dereference the password field
}
}
實施指南
-
立即擦除:憑證應在不再需要時(通常在身份驗證後)立即擦除。
-
自動呼叫:確保
eraseCredentials()在身份驗證過程完成後由您的身份驗證框架(例如AuthenticationManager)自動呼叫。 -
一致性:在所有應用程式中統一應用此做法,以防止可能導致資料洩露的安全漏洞。
超越基本介面實現
雖然 CredentialsContainer 等介面提供了憑證管理的框架,但實際實現通常取決於特定的類及其互動。
例如,DaoAuthenticationProvider 類,遵守 AuthenticationProvider 的契約,不會在其自身的 authenticate 方法中執行憑證擦除。相反,它依賴於 ProviderManager(Spring Security 中 AuthenticationManager 的預設實現)來處理身份驗證後的憑證和其他敏感資料的擦除。這種分離強調了 AuthenticationProvider 不應承擔憑證管理職責的原則。
將 CredentialsContainer 納入您的 UserDetails 實現與安全最佳實踐保持一致,透過最大限度地縮短敏感資料在記憶體中的生命週期,降低了資料洩露的潛在風險。