【问题标题】:How do I get a JwtAuthenticationToken for my HandlerMethodArgumentResolver from the request's Authorization header?如何从请求的 Authorization 标头中为我的 HandlerMethodArgumentResolver 获取 JwtAuthenticationToken?
【发布时间】:2022-01-09 09:52:34
【问题描述】:

我有一个 Spring Boot 应用程序,它需要在 HTTP Authorization 标头中传递一个 JwtAuthenticationToken。标头本身提供了不记名令牌; 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 标头中获取承载令牌作为字符串。

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

【问题讨论】:

    标签: java spring-boot spring-security


    【解决方案1】:

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

    我用一篇 Baeldung 文章帮我搭建了 HandlerMethodArgumentResolver: https://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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多