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
相关产品推荐
相关产品推荐

