【问题标题】:Spring Security injecting null @AuthenticatedPrincipal into controllersSpring Security 将 null @AuthenticatedPrincipal 注入控制器
【发布时间】:2022-01-08 23:57:03
【问题描述】:

Java 11,这里是 Spring Security。我的@RestController 中有以下端点/方法:

@GetMapping("/centerPoint")
public void centerPoint(@AuthenticationPrincipal ExpiringUsernameAuthenticationToken token,
          HttpServletResponse response) throws IOException {
            
  Authentication auth = SecurityContextHolder.getContext().getAuthentication();
  if (auth == null) {
    LOGGER.warn("Current authentication instance from security context is null");
    response.sendRedirect("some redirect url");
    return;
  }

  SAMLCredential attributes = ((SAMLCredential) token.getCredentials());
  // ...rest of code omitted for brevity
  
}

当我在此方法中设置断点并登录到我的应用程序时,tokennull(意味着它没有正确注入为 @AuthenticatedPrincipal然而 SecurityContextHolder.getContext().getAuthentication() 返回一个Authentication 看起来完全没问题的实例。当token.getCredentials() 在底部被调用时,我得到一个 NPE。

我知道这是一个不完整的代码 sn-p,我很乐意提供安全代码的其他部分(WebSecurityConfig 等)但是我想知道:什么会导致 SecurityContextHolder.getContext().getAuthentication() 不null,但没有要注入的token

【问题讨论】:

  • (那个)匿名用户!? (例如,当端点是:authenticated()...permitAll()

标签: java spring-security


【解决方案1】:

AuthenticationPrincipalArgumentResolver 中的 javadoc 说明如下:

将使用 Authentication.getPrincipal() 解析 CustomUser 参数 安全上下文持有者。如果身份验证或 Authentication.getPrincipal() 为 null,它将返回 null。如果 类型不匹配,除非返回 null AuthenticationPrincipal.errorOnInvalidType() 为真,在这种情况下 将抛出 ClassCastException。

所以你应该确保Authentication.getPrincipal() 类型是ExpiringUsernameAuthenticationToken

调试您的应用程序并查看从SecurityContextHolder.getContext().getAuthentication()authentication.getPrincipal() 返回的类型

【讨论】:

    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2014-07-08
    • 2017-07-26
    • 2013-10-24
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多