1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
我認(rèn)為你的旁路工作正常。它跳過(guò)檢查。
安全的授權(quán)檢查部分從 SecurityContext 中獲取經(jīng)過(guò)身份驗(yàn)證的對(duì)象,當(dāng)請(qǐng)求通過(guò) spring 安全過(guò)濾器時(shí)將設(shè)置該對(duì)象。
因此,當(dāng)您跳過(guò)安全過(guò)濾器 SecurityContext 尚未設(shè)置因此錯(cuò)誤
你可以做這樣的事情來(lái)為你的自定義標(biāo)題案例手動(dòng)設(shè)置
try {
SecurityContext ctx = SecurityContextHolder.createEmptyContext();
SecurityContextHolder.setContext(ctx);
ctx.setAuthentication(event.getAuthentication());
} finally {
SecurityContextHolder.clearContext();
}
編輯1:
解答所有疑問(wèn)。
但如果是這樣,那么我猜所有 GET 調(diào)用也應(yīng)該失敗,但我的 GET 調(diào)用工作正常。
由于您添加了這一行,因此安全檢查會(huì)跳過(guò)所有 GET 調(diào)用。
.antMatchers(HttpMethod.GET, securityProps.getNoAuthGetPattern()).permitAll()
我在哪里可以添加你提到的代碼?任何特定的過(guò)濾器或其他地方?
我在過(guò)濾器中做過(guò)類似的事情。參考這里
看TokenAuthenticationFilterClass in Answer。在哪里手動(dòng)設(shè)置。
注意:它的 JWT 實(shí)現(xiàn)但很好參考
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
if (tokenHelper.validateToken(authToken, userDetails)) {
// create authentication
TokenBasedAuthentication authentication = new TokenBasedAuthentication(userDetails);
authentication.setToken(authToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
}
您的答案中的事件是什么?
我剛剛從 Some Answer 那里得到了那個(gè)案例,現(xiàn)在找不到它的鏈接。但你可以setAuthentication喜歡這個(gè)或喜歡上面
Authentication authentication = new PreAuthenticatedAuthenticationToken("system", null);
authentication.setAuthenticated(true);
context.setAuthentication(authentication);
添加回答
舉報(bào)