使用 Spring Security 手動驗證用戶

1。概述

在這篇快速文章中,我們將重點介紹如何在 Spring Security 和 Spring MVC 中手動驗證用戶的身份。

2。Spring Security

簡單地說,Spring Security 將每個經過身份驗證的用戶的主體信息保存在 ThreadLocal 中——表示為 Authentication 對象。

為了構造和設置這個 Authentication 對象——我們需要使用 Spring Security 通常用來在標準身份驗證上構建對象的相同方法。

為此,讓我們手動觸發身份驗證,然後將生成的 Authentication 對象設置為框架用來保存當前登錄用戶的當前 SecurityContext

UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass);
Authentication auth = authManager.authenticate(authReq);
SecurityContext sc = SecurityContextHolder.getContext();
sc.setAuthentication(auth);

在上下文中設置 Authentication 後,我們現在可以使用 securityContext.getAuthentication().isAuthenticated() 檢查當前用戶是否已通過身份驗證。

3。Spring MVC

默認情況下,Spring Security 在 Spring Security 過濾器鏈中添加了一個額外的過濾器——它能夠持久化安全上下文(SecurityContextPersistenceFilter 類)。

反過來,它將安全上下文的持久性委託給 SecurityContextRepository 的實例,默認為 HttpSessionSecurityContextRepository 類。

因此,為了對請求設置身份驗證並因此使其可用於來自客戶端的所有後續請求,我們需要在 HTTP 會話中手動設置包含 AuthenticationSecurityContext

public void login(HttpServletRequest req, String user, String pass) { 
    UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass);
    Authentication auth = authManager.authenticate(authReq);
    
    SecurityContext sc = SecurityContextHolder.getContext();
    sc.setAuthentication(auth);
    HttpSession session = req.getSession(true);
    session.setAttribute(SPRING_SECURITY_CONTEXT_KEY, sc);
}

SPRING_SECURITY_CONTEXT_KEY 是靜態導入的 HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY

需要注意的是,我們不能直接使用 HttpSessionSecurityContextRepository — 因為它與 SecurityContextPersistenceFilter. 一起工作

這是因為過濾器使用存儲庫在鏈中定義的其餘過濾器執行之前和之後加載和存儲安全上下文,但它對傳遞給鏈的響應使用自定義包裝器。

所以在這種情況下,您應該知道所使用的包裝器的類類型,並將其傳遞給存儲庫中適當的保存方法。

4。結論

在這個快速教程中,我們討論了如何在 Spring Security 上下文中手動設置用戶 Authentication 以及如何使其可用於 Spring MVC 目的,重點介紹了說明實現它的最簡單方法的代碼示例。

與往常一樣,可以在 GitHub 上 找到代碼示例。

Tags: