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 导致了问题
我们正在使用 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 导致了问题