You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot OAuth2环境下如何从Rest Controller获取JWT Token?

如何在Spring Boot控制器中获取JWT Token(OAuth2认证场景)

嗨,我来帮你搞定这个问题!你当前用OAuth2Authentication只能拿到用户名这类用户信息,是因为这个对象本身并不直接存储JWT Token——Token其实是通过请求头传递到服务端的,或者可以从Spring Security的认证上下文细节中提取。下面给你几种实用的实现方案:

方法1:直接从请求头提取Token

JWT Token通常是放在Authorization请求头里,格式为Bearer <你的Token>,所以可以直接通过HttpServletRequest获取:

import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/users")
public class UserController {
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @GetMapping
    public List<AppUser> getUsers(HttpServletRequest request) {
        String authHeader = request.getHeader("Authorization");
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            // 去掉"Bearer "前缀,拿到纯Token
            String jwtToken = authHeader.substring(7);
            logger.info("获取到的JWT Token: {}", jwtToken);
        }
        return userService.findAllUsers();
    }
}

这种方法的优势是通用性极强,不管你的OAuth2配置是哪种类型,只要客户端是按标准方式传递Token,就能生效。

方法2:从Spring Security认证细节中提取

如果你的项目用的是传统Spring OAuth2配置,Authentication对象的details属性会包含OAuth2AuthenticationDetails,里面直接存储了Token值:

import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/users")
public class UserController {
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @GetMapping
    public List<AppUser> getUsers(Authentication authentication) {
        // 强制转换为OAuth2认证细节类
        OAuth2AuthenticationDetails details = (OAuth2AuthenticationDetails) authentication.getDetails();
        String jwtToken = details.getTokenValue();
        logger.info("获取到的JWT Token: {}", jwtToken);
        return userService.findAllUsers();
    }
}

这种方法更贴合Spring Security的认证体系,不需要直接操作请求头,代码更“优雅”。

方法3:Spring Security 5+资源服务器专属方案

如果你的项目用的是Spring Security 5及以上版本,并且引入了spring-boot-starter-oauth2-resource-server作为资源服务器,可以直接注入JwtAuthenticationToken,它不仅能拿到Token,还能直接解析JWT里的Claims:

import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/users")
public class UserController {
    private static final Logger logger = LoggerFactory.getLogger(UserController.class);

    @GetMapping
    public List<AppUser> getUsers(JwtAuthenticationToken jwtAuthToken) {
        // 获取原始Token字符串
        String jwtToken = jwtAuthToken.getToken().getTokenValue();
        logger.info("获取到的JWT Token: {}", jwtToken);
        
        // 还能直接获取JWT中的Claims(比如用户ID、权限等)
        logger.info("JWT Claims: {}", jwtAuthToken.getToken().getClaims());
        
        return userService.findAllUsers();
    }
}

这是Spring官方推荐的现代化方案,适合新搭建的项目。

你可以根据自己项目的Spring版本和OAuth2配置类型,选择最适合的方法~

内容的提问来源于stack exchange,提问作者Tartar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:23:22