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);在配置身份驗證後,我們現在可以檢查當前用户是否已認證——使用 <em >securityContext.getAuthentication().isAuthenticated()</em >。
3. Spring MVC
默認情況下,Spring Security會在Spring Security過濾器鏈中添加一個額外的過濾器——SecurityContextPersistenceFilter 類,它可以持久化 Security Context。
它會將 Security Context 的持久化委託給 SecurityContextRepository 實例,默認使用 HttpSessionSecurityContextRepository 類。
因此,為了在請求上設置身份驗證,並使其可供客户端後續所有請求使用,我們需要手動將包含 Authentication 的 SecurityContext 設置到 HTTP 會話中:
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 上下文中設置用户 身份驗證,以及如何將其提供給 Spring MVC 用途,重點介紹了用於説明實現最簡單方法代碼示例。