1 回答
![?](http://img1.sycdn.imooc.com/545847f50001126402200220-100-100.jpg)
TA贡献1818条经验 获得超8个赞
我认为你的旁路工作正常。它跳过检查。
安全的授权检查部分从 SecurityContext 中获取经过身份验证的对象,当请求通过 spring 安全过滤器时将设置该对象。
因此,当您跳过安全过滤器 SecurityContext 尚未设置因此错误
你可以做这样的事情来为你的自定义标题案例手动设置
try {
SecurityContext ctx = SecurityContextHolder.createEmptyContext();
SecurityContextHolder.setContext(ctx);
ctx.setAuthentication(event.getAuthentication());
} finally {
SecurityContextHolder.clearContext();
}
编辑1:
解答所有疑问。
但如果是这样,那么我猜所有 GET 调用也应该失败,但我的 GET 调用工作正常。
由于您添加了这一行,因此安全检查会跳过所有 GET 调用。
.antMatchers(HttpMethod.GET, securityProps.getNoAuthGetPattern()).permitAll()
我在哪里可以添加你提到的代码?任何特定的过滤器或其他地方?
我在过滤器中做过类似的事情。参考这里
看TokenAuthenticationFilterClass in Answer。在哪里手动设置。
注意:它的 JWT 实现但很好参考
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 那里得到了那个案例,现在找不到它的链接。但你可以setAuthentication喜欢这个或喜欢上面
Authentication authentication = new PreAuthenticatedAuthenticationToken("system", null);
authentication.setAuthenticated(true);
context.setAuthentication(authentication);
添加回答
举报