是否需要SecurityContextHolder

时间:2020-07-16 14:06:35

标签: java spring security spring-security jwt

我已经实现了一个特定的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);
    }
}

1 个答案:

答案 0 :(得分:1)

SecurityContextHolderThreadLocal上下文中保存身份验证信息(默认情况下)。它是Spring Security的基本帮助程序类,它提供对安全上下文的访问。您(和框架)可以在同一线程中运行的每个方法中访问身份验证。即使保护URL或使用方法安全性也是必需的,但是有时您也需要业务逻辑中的用户信息,并且可以从那里获取信息。 因此,答案是肯定的,如果您使用spring安全性,那么它总是需要的。