在将身份验证设置为spring安全上下文后调用chain.dofilter(请求,响应)时如何工作?

lf5gs5x2  于 2021-07-14  发布在  Java
关注(0)|答案(0)|浏览(188)

关闭。这个问题需要更加突出重点。它目前不接受答案。
**想改进这个问题吗?**通过编辑这篇文章更新这个问题,使它只关注一个问题。

三小时前关门了。
改进这个问题
我一直在学习 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令牌不意味着用户被验证了吗?那为什么还要再次调用身份验证过滤器呢?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题