如何从请求的授权 header 中为我的 HandlerMethodArgumentResolver 获取 JwtAuthenticationToken?

How do I get a JwtAuthenticationToken for my HandlerMethodArgumentResolver from the request's Authorization header?

我有一个 Spring 启动应用程序,需要在 HTTP Authorization header 中传递的 JwtAuthenticationToken。 header 本身提供了不记名令牌; Spring 正在做一些我目前不知道的魔术,将不记名令牌字符串转换为 JwtAuthenticationToken。我有一些代码可以从令牌中提取用户 ID,用于在服务器上定位正确的资源。

private String getUidFromToken(JwtAuthenticationToken token) {
  // this is placeholder code to demonstrate what I'm doing with the token
}

public ResponseEntity<String> getUserProfile(JwtAuthenticationToken token) {
  String uid = getUidFromToken(token);
  // rest of the code
}

因为我在几个不同的地方需要这些标记,所以我决定考虑将 getUidFromToken 代码移到 HandlerMethodArgumentResolver 中。我遇到的麻烦是我需要一个 JwtAuthenticationToken,但我只从 Authorization header 中获取不记名令牌作为字符串。

我可以得到 JwtAuthenticationToken 而不是字符串吗?

我在专业熟人的帮助下弄明白了。诀窍是获取允许您获取当前身份验证的静态安全上下文。然后,获得我正在寻找的 uid 声明是微不足道的。

我使用了一篇 Baeldung 文章来帮助我构建 HandlerMethodArgumentResolverhttps://www.baeldung.com/spring-mvc-custom-data-binder#1-custom-argument-resolver

这是我在 resolveArgument 方法中所做的:

@Override
public Object resolveArgument(
    MethodParameter parameter,
    ModelAndViewContainer mavContainer,
    NativeWebRequest webRequest,
    WebDataBinderFactory binderFactory)
    throws Exception {
  final var auth = (JwtAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
  final var token = auth.getToken();
  if (token.hasClaim("uid")) {
    return token.getClaimAsString("uid");
  } else {
    return null;
  }
}