如何使用Spring Security手動(dòng)驗(yàn)證用戶的方法示例
1.概述
在這篇快速文章中,我們將 重點(diǎn)介紹如何以編程方式在Spring Security和Spring MVC中設(shè)置經(jīng)過(guò)身份驗(yàn)證的用戶 。
2. Spring Security
簡(jiǎn)而言之, Spring Security在ThreadLocal中保存每個(gè)經(jīng)過(guò)身份驗(yàn)證的用戶的主要信息 - 保存的是Authentication對(duì)象 。
為了構(gòu)造和設(shè)置此Authentication對(duì)象, 通常我們需要使用Spring Security在標(biāo)準(zhǔn)身份驗(yàn)證上構(gòu)建對(duì)象的相 同方法。
要讓我們手動(dòng)觸發(fā)身份驗(yàn)證, 然后將生成的身份驗(yàn)證對(duì)象設(shè)置為框架用來(lái)保存當(dāng)前登錄用戶的當(dāng)前SecurityContext :
UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass); Authentication auth = authManager.authenticate(authReq); SecurityContext sc = SecurityContextHolder.getContext(); securityContext.setAuthentication(auth);
在上下文中設(shè)置身 份驗(yàn)證后,我們現(xiàn)在可以使用securityContext.getAuthentication()。isAuthenticated()檢查當(dāng)前用戶是否經(jīng)過(guò)身份驗(yàn)證 。
3. Spring MVC
默認(rèn)情況下,Spring Security 在Spring Security過(guò)濾器鏈中添加了一個(gè)額外的過(guò)濾器。它能夠持久化Security 上下 文(SecurityContextPersistenceFilter類)。
反過(guò)來(lái), 它將Security上下文的持久性委托給SecurityContextRepository的實(shí)例,默認(rèn)為HttpSessionSecurityContextRepository 類。
因此,為了 在請(qǐng)求上設(shè)置身份驗(yàn)證并因此使其可用于來(lái)自客戶端的所有后續(xù)請(qǐng)求,我們需要在HTTP會(huì)話中手動(dòng)設(shè)置包含身份驗(yàn)證的SecurityContext :
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是靜態(tài)導(dǎo)入的HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY。
應(yīng)該注意 的是,我們不能直接使用HttpSessionSecurityContextRepository - 因?yàn)樗cSecurityContextPersistenceFilter一起 使用。
這是因?yàn)檫^(guò)濾 器使用存儲(chǔ)庫(kù)來(lái)加載和存儲(chǔ)Security上下文在前,在鏈中執(zhí)行其余已定義的過(guò)濾器在后,但是它在傳遞給鏈的響應(yīng)上使用自定義 包裝器。。
因此,在這種情況下,您應(yīng)該知道所使用的包裝器的類類型,并將其傳遞給存儲(chǔ)庫(kù)中的相應(yīng)save方法。
4.總結(jié)
在這個(gè)快速教程中,我們討論了如何在Spring Security上下文中手動(dòng)設(shè)置用戶身份驗(yàn)證以及如何使其可用于Spring MVC的目標(biāo)。專注于代碼示例,說(shuō)明實(shí)現(xiàn)它的最簡(jiǎn)單 方法。
與往常一樣,可以 在GitHub上找到代碼 示例。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java中VO和DTO之間的轉(zhuǎn)換實(shí)現(xiàn)
本文主要介紹了java中VO和DTO之間的轉(zhuǎn)換實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05詳解SpringBoot如何優(yōu)雅的進(jìn)行前后端通信
現(xiàn)在的項(xiàng)目基本上都是前后端分離的項(xiàng)目,如何打通前后端,接收前端傳過(guò)來(lái)的參數(shù)呢,下面小編就來(lái)和大家詳細(xì)介紹一下SpringBoot如何優(yōu)雅的進(jìn)行前后端通信2024-03-03java驗(yàn)證用戶是否已經(jīng)登錄 java實(shí)現(xiàn)自動(dòng)登錄
這篇文章主要介紹了java驗(yàn)證用戶是否已經(jīng)登錄,java實(shí)現(xiàn)自動(dòng)登錄,感興趣的小伙伴們可以參考一下2016-04-04Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼(前端部分)
這篇文章主要為大家介紹了如何用Java語(yǔ)言實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的生成(前端部分),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下2022-10-10