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

Springboot JWT认证:已认证路径无法获取接口数据问题

问题描述

搭建了基础JWT认证Demo,已实现注册、登录(生成Token)及认证功能,但在Postman中携带Token请求接口时,仅返回Ok状态,无法获取控制器返回的数据。

控制器代码:

@GetMapping
public ResponseEntity<String> getHome(){
    return ResponseEntity.ok("Hello world");
    //return userService.getUsers();
}

认证配置代码(添加permitAll()后接口可正常访问):

http.csrf(AbstractHttpConfigurer::disable)
    .authorizeHttpRequests(rq -> {
        rq.requestMatchers("/api/user/**").permitAll();
        rq.requestMatchers("/home/**").permitAll(); 
        rq.anyRequest().authenticated();
    });

仅当/home/**设置为permitAll()时,无需认证可正常访问接口;带Token认证时无法获取返回数据,寻求解决方法。

排查与解决方法
  • 检查Token携带方式:确保在Postman请求头中添加Authorization字段,值格式为Bearer <Token字符串>(注意Bearer后有空格),不要将Token放在URL参数或其他非标准位置。
  • 验证JWT过滤器逻辑:检查自定义JWT过滤器(如OncePerRequestFilter实现类),确认认证通过后是否将认证信息存入SecurityContextHolder,且调用了filterChain.doFilter(request, response),确保请求能流转到控制器。示例正确逻辑:
    Authentication authentication = jwtAuthenticationToken(token);
    SecurityContextHolder.getContext().setAuthentication(authentication);
    filterChain.doFilter(request, response);
    
  • 确认过滤器注册:在Spring Security配置中需将JWT过滤器添加到认证流程,示例代码:
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    
    未注册过滤器会导致带Token的请求被默认认证流程拦截,无法到达控制器。
  • 校验Token有效性:用JWT解析工具验证Token是否未过期、签名密钥与生成时一致、包含必要认证信息(如username、authorities),无效Token会导致认证失败,请求被截断。
  • 核对请求路径匹配:确认控制器类上的@RequestMapping路径(如/home)与配置中的/home/**匹配,且请求URL正确(如GET /home)。
  • 开启日志排查:在配置文件中开启Spring Security DEBUG日志,查看认证流程细节:
    logging:
      level:
        org.springframework.security: DEBUG
    
    通过日志定位Token解析、认证成功与否、请求拦截等环节的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 12:23:27