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

使用JWT过滤器时如何正确配置WebSecurityConfigurerAdapter

问题排查与解答

一、当前代码无法正常运行的核心原因

  • 缺失基础授权规则配置:Spring Security默认所有请求都需要认证才能访问,你仅配置了/profile端点加载JWT过滤器,但没有显式声明/signin、/signup这类公开接口允许匿名访问,导致登录、注册请求直接被Spring Security的默认拦截逻辑拒绝,根本不会进入对应接口。
  • 自定义异常未配置对应处理逻辑:你在JwtTokenFilter中直接抛出TokenException等自定义异常,但没有在配置类中注册异常处理器,这类异常会被框架识别为未捕获的服务端错误,返回500状态码而非预期的401类错误。
  • 没有显式声明受保护端点的认证要求:你仅给/profile挂了JWT过滤器,但没有明确配置该接口需要认证,极端情况下会出现过滤器没生效时未携带token也能访问接口的漏洞。

二、被注释的代码作用说明

你注释掉的代码都是核心业务配置,并非无用代码:

  • http.authorizeRequests().antMatchers("/signin","/signup").permitAll():必须开启,作用是声明登录、注册接口为公开接口,无需携带token也能访问,符合业务逻辑。
  • antMatchers("/profile").authenticated():建议开启,明确声明/profile端点必须携带有效认证信息才能访问,和过滤器配置形成双重校验。
  • 注释的accessDeniedHandler配置:建议开启,用于处理权限不足的请求,返回自定义的状态码和提示,避免框架返回默认的错误页。
  • 被注释的角色校验配置(hasAnyRole相关):如果后续有接口需要区分用户角色才能访问,就需要用到这类配置,现在不需要可以保持注释。

三、JWT认证与鉴权的执行顺序说明

你混淆了认证和鉴权的顺序,不存在“JWT过滤器执行前完成鉴权”的逻辑,正确执行顺序如下:

  1. 请求进入Spring Security过滤器链
  2. 先匹配请求路径,如果是/profile这类受保护路径,执行JWT过滤器:解析请求头的token,校验有效性后查询用户信息和角色,生成Authentication对象存入SecurityContextHolder
  3. 过滤器执行完成后进入授权校验层:Spring Security根据你配置的授权规则(比如是否需要登录、是否需要指定角色),读取SecurityContextHolder中的认证信息做权限判断
  4. 权限校验通过后,请求才会进入对应的Controller接口

修复建议

  1. 放开注释的公开接口配置:http.authorizeRequests().antMatchers("/signin","/signup").permitAll().anyRequest().authenticated()
  2. 保留异常处理器配置,自定义异常的响应格式和状态码
  3. 优化JWT过滤器逻辑:如果token校验失败,直接往HttpServletResponse中写入401状态码和错误信息,不要直接抛出未处理的异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 17:06:03