【问题标题】:Is SecurityContextHolder necessary是否需要 SecurityContextHolder
【发布时间】:2020-11-06 05:36:16
【问题描述】:

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

【问题讨论】:

    标签: java spring security spring-security jwt


    【解决方案1】:

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

    【讨论】:

    • 是否有任何令牌仅用于存储客户端的 id。上面的代码有 UsernamePasswordAuthenticationToken 并且为了设置 SecurityContextHolder 我需要一个实现 Authentication 接口的类,不是吗? @zlaval
    • 你可以在这里找到 spring 实现:docs.spring.io/spring-security/site/docs/4.2.15.RELEASE/apidocs/… 此外,很容易创建自己的从链接类扩展的实现。
    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多