如何从请求的授权 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 文章来帮助我构建 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;
}
}
我有一个 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 文章来帮助我构建 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;
}
}