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類,它能夠持久化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協同工作。
這是因為過濾器使用該存儲庫在鏈中執行其他定義的過濾器之前和之後加載和存儲Security Context,但它使用傳遞到鏈中的響應包裝器。
因此,在這種情況下,您應該瞭解所使用的包裝器的類類型並將其傳遞給存儲庫的適當保存方法。
4. 結論
在本快速教程中,我們介紹瞭如何手動在 Spring Security 上下文中設置用户 身份驗證,並探討了如何將其用於 Spring MVC 目的,重點介紹了用於演示最簡單實現方式的代碼示例。