关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。
三小时前关门了。
改进这个问题
我一直在学习 Spring 安全。我遇到了下面的代码
@Component
public class JwtTokenFilter extends OncePerRequestFilter {
private final JwtTokenUtil jwtTokenUtil;
private final UserRepo userRepo;
public JwtTokenFilter(JwtTokenUtil jwtTokenUtil,
UserRepo userRepo) {
this.jwtTokenUtil = jwtTokenUtil;
this.userRepo = userRepo;
}
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain)
throws ServletException, IOException {
// Get authorization header and validate
final String header = request.getHeader(HttpHeaders.AUTHORIZATION);
if (isEmpty(header) || !header.startsWith("Bearer ")) {
chain.doFilter(request, response);
return;
}
// Get jwt token and validate
final String token = header.split(" ")[1].trim();
if (!jwtTokenUtil.validate(token)) {
chain.doFilter(request, response);
return;
}
// Get user identity and set it on the spring security context
UserDetails userDetails = userRepo
.findByUsername(jwtTokenUtil.getUsername(token))
.orElse(null);
UsernamePasswordAuthenticationToken
authentication = new UsernamePasswordAuthenticationToken(
userDetails, null,
userDetails == null ?
List.of() : userDetails.getAuthorities()
);
authentication.setDetails(
new WebAuthenticationDetailsSource().buildDetails(request)
);
SecurityContextHolder.getContext().setAuthentication(authentication);
chain.doFilter(request, response);
}
}
这里,如果授权头是空的或者不包含jwt令牌,那么 doFilter()
调用下一个过滤器,如果找到承载令牌,则验证它,如果发现无效,则再次验证 doFilter()
方法是inovked.same与有效的jwt令牌唯一的区别是在调用下一个过滤器之前,我们正在将身份验证设置为spring安全上下文。那么这3个 doFilter()
调用不同的功能?
在本教程中,下面的一段也让我感到困惑
请注意,我们在spring security internal usernamepasswordauthenticationfilter之前添加了jwttokenfilter。我们这样做是因为我们需要在此时访问用户身份以执行身份验证/授权,它的提取在基于提供的jwt令牌的jwt令牌过滤器中进行。
我们正在将身份验证对象设置为安全上下文,那么用户不是经过身份验证了吗?为什么还要打电话 UsernamePasswordAuthenticationFilter
?一个有效的jwt令牌不意味着用户被验证了吗?那为什么还要再次调用身份验证过滤器呢?
暂无答案!
目前还没有任何答案,快来回答吧!