Spring Boot:如何从Postman请求的Bearer Token中提取用户名?
从Bearer Token提取用户名的实操方案
你的场景里,Web应用请求时getRemoteUser()能正常返回,是因为应用内已经完成了认证上下文的传递,但Postman直接发请求时没有走这套上下文流程,所以只能从请求头的Bearer Token里提取用户名。
核心前提
你的Bearer Token几乎肯定是JWT(JSON Web Token),这是当前主流的认证Token格式,下面分两种场景给出解决方案:
1. 轻量手动解析(快速验证/测试场景)
JWT由Header.Payload.Signature三段组成,中间的Payload是Base64URL编码的JSON,里面包含用户身份信息(通常是sub字段,也可能是username):
// 从请求头提取Token String authHeader = request.getHeader("Authorization"); String jwtToken = null; if (authHeader != null && authHeader.startsWith("Bearer ")) { // 去掉"Bearer "前缀,拿到纯Token字符串 jwtToken = authHeader.substring(7); } if (jwtToken != null) { // 拆分JWT的三段 String[] jwtParts = jwtToken.split("\\."); if (jwtParts.length == 3) { // 解码Payload部分(Base64URL解码) String payloadJson = new String(Base64.getUrlDecoder().decode(jwtParts[1])); // 用JSON工具解析,这里以Jackson为例 ObjectMapper objectMapper = new ObjectMapper(); JsonNode payloadNode = objectMapper.readTree(payloadJson); // 提取用户名:根据你的Token实际字段调整,常见字段是"sub"或"username" String username = payloadNode.get("sub").asText(); // 或者 String username = payloadNode.get("username").asText(); } }
2. 安全解析(生产环境推荐)
手动解析跳过了签名验证,存在伪造Token的风险,生产环境建议用对应框架的JWT解析工具,比如Spring Security的JwtDecoder:
// 注入Spring Security的JwtDecoder(需要提前配置好密钥/公钥) @Autowired private JwtDecoder jwtDecoder; public String extractUsernameFromToken(String authHeader) { if (authHeader == null || !authHeader.startsWith("Bearer ")) { return null; } String jwtToken = authHeader.substring(7); // 解析并验证Token签名、有效期等 Jwt jwt = jwtDecoder.decode(jwtToken); // 提取用户名,字段名根据实际Token调整 return jwt.getClaim("sub").asString(); }
关键注意点
- 先确认Token的Payload字段:可以把Token复制到本地JSON解析工具(比如IDEA的JSON插件)解码后查看,确保用对字段名(不要依赖在线工具,避免泄露敏感信息)
- 生产环境必须验证Token的合法性:包括签名、有效期、受众(aud)等,防止恶意伪造的Token
- 如果你的Token不是JWT,是自定义格式,需要联系Token生成方获取解析规则
内容的提问来源于stack exchange,提问作者Rachan R K
相关产品推荐
相关产品推荐

