我已经实现了一个特定的Oauth令牌。当客户信息满足特定条件时创建。当我分析之前为jwt编写的代码时,使用了ID和密码。每个代码中的contextSecurityHolder和身份验证机制几乎相同。使用它们的主要目的是什么,始终需要contextSecurityHolder吗?
这是示例代码:
@Component
public class JwtTokenFilter extends OncePerRequestFilter {
@Autowired
private TokenManager tokenManager;
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
FilterChain filterChain) throws ServletException, IOException {
final String authHeader = httpServletRequest.getHeader("Authorization");
String username = null;
String token = null;
if (authHeader != null && authHeader.contains("Bearer")) {
token = authHeader.substring(7);
try {
username = tokenManager.getUsernameToken(token);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
if (username != null && token != null
&& SecurityContextHolder.getContext().getAuthentication() == null) {
if (tokenManager.tokenValidate(token)) {
UsernamePasswordAuthenticationToken upassToken =
new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());
upassToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest));
SecurityContextHolder.getContext().setAuthentication(upassToken);
}
}
filterChain.doFilter(httpServletRequest, httpServletResponse);
}
}
答案 0 :(得分:1)
SecurityContextHolder
在ThreadLocal
上下文中保存身份验证信息(默认情况下)。它是Spring Security的基本帮助程序类,它提供对安全上下文的访问。您(和框架)可以在同一线程中运行的每个方法中访问身份验证。即使保护URL或使用方法安全性也是必需的,但是有时您也需要业务逻辑中的用户信息,并且可以从那里获取信息。
因此,答案是肯定的,如果您使用spring安全性,那么它总是需要的。