1. 概述
在本快速教程中,我們將討論如何在 Spring Security 實現中,在註冊流程完成後立即自動驗證用户。
簡單來説,一旦用户完成註冊,他們通常會被重定向到登錄頁面,並需要重新輸入用户名和密碼。
讓我們看看如何通過自動驗證用户來避免這種情況。
在開始之前,請注意,我們正在本網站的註冊系列範圍內工作。
使用 HttpServletRequest 對象
通過利用 HttpServletRequest 對象的 login() 方法,可以實現一種簡單的方式來程序化強制認證:
// 註釋:這段代碼演示瞭如何使用 login() 方法進行認證。
// 具體的認證邏輯需要根據實際情況進行調整。
public void authWithHttpServletRequest(HttpServletRequest request, String username, String password) {
try {
request.login(username, password);
} catch (ServletException e) {
LOGGER.error("Error while login ", e);
}
}現在,在底層,HttpServletRequest.login() API 使用 AuthenticationManager 來執行身份驗證。
同時,也需要理解並處理在此級別可能發生的 ServletException。
3. 使用 AuthenticationManager
接下來,我們還可以直接創建 UsernamePasswordAuthenticationToken – 然後手動通過標準的 AuthenticationManager 進行處理:
public void authWithAuthManager(HttpServletRequest request, String username, String password) {
UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password);
authToken.setDetails(new WebAuthenticationDetails(request));
Authentication authentication = authenticationManager.authenticate(authToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
}請注意我們是如何創建令牌請求的,將其傳遞到標準身份驗證流程中,然後明確地將其結果設置在當前安全上下文中。
4. 複雜註冊流程
在某些更復雜的場景中,註冊流程包含多個階段,例如用户需要確認才能登錄系統。
在這種情況下,當然重要的是要了解我們可以在哪裏自動驗證用户。因為在用户註冊後立即進行自動驗證是不可能的,因為此時新創建的賬户仍然處於禁用狀態。
簡單來説——我們必須在用户確認賬户後執行自動驗證。
此外,請記住,此時我們不再擁有用户的實際憑證。我們只能訪問用户的編碼後的密碼——這是我們在此處使用的內容:
public void authWithoutPassword(User user){
List<Privilege> privileges = user.getRoles().stream().map(Role::getPrivileges)
.flatMap(Collection::stream).distinct().collect(Collectors.toList());
List<GrantedAuthority> authorities = privileges.stream()
.map(p -> new SimpleGrantedAuthority(p.getName()))
.collect(Collectors.toList());
Authentication authentication = new UsernamePasswordAuthenticationToken(user, null, authorities);
SecurityContextHolder.getContext().setAuthentication(authentication);
}請注意,我們在這裏正確地設置了認證權限,這與在 AuthenticationProvider 中通常的做法一致。
5. 結論
我們討論了在註冊流程後自動驗證用户身份的不同方法。