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过滤器添加到认证流程,示例代码:
未注册过滤器会导致带Token的请求被默认认证流程拦截,无法到达控制器。http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); - 校验Token有效性:用JWT解析工具验证Token是否未过期、签名密钥与生成时一致、包含必要认证信息(如username、authorities),无效Token会导致认证失败,请求被截断。
- 核对请求路径匹配:确认控制器类上的
@RequestMapping路径(如/home)与配置中的/home/**匹配,且请求URL正确(如GET /home)。 - 开启日志排查:在配置文件中开启Spring Security DEBUG日志,查看认证流程细节:
通过日志定位Token解析、认证成功与否、请求拦截等环节的问题。logging: level: org.springframework.security: DEBUG
内容的提问来源于stack exchange,提问作者Joaquinm
相关产品推荐
相关产品推荐

