Spring 安全 getprincipal() 方法 returns 字符串(用户名)代替 class UserDetails

Spring Security getprincipal() method returns string (Username) in place of class UserDetails

我们正在使用 Spring-boot 2.0.5 和 JWT 令牌

SecurityContextHolder.getContext().getAuthentication().getPrincipal() 返回 String (Username) 代替 CustomUserDetails 仅在 WAR 文件中实现 UserDetails class 的对象。

这个问题只是偶尔重复,大多数时候代码运行良好

下面提到的是我们正在使用的唯一自定义过滤器,它在 FilterSecurityInterceptor 过滤器之后调用

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
        throws IOException, ServletException {
    CustomHttpServletRequestWrapper request = new CustomHttpServletRequestWrapper((HttpServletRequest) req);
    if(request!=null && request.getHeader("Authorization")!=null && request.getHeader("Authorization").length()>7) {

        CustomUserDetails user = (CustomUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
}

它应该返回用户详细信息对象

信息不足,无法为您提供任何答案,最好知道:

  • 来自 SecurityContextHolder.getContext().getAuthentication() 的哪个实例 returns?
  • 您拥有的安全过滤器列表是什么?您的自定义过滤器位于何处?
  • 这是什么时候发生的?你必须知道重现它的步骤

在我们的例子中,有两个同名的 Bean 导致了问题