使用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过滤器执行前完成鉴权”的逻辑,正确执行顺序如下:
- 请求进入Spring Security过滤器链
- 先匹配请求路径,如果是
/profile这类受保护路径,执行JWT过滤器:解析请求头的token,校验有效性后查询用户信息和角色,生成Authentication对象存入SecurityContextHolder - 过滤器执行完成后进入授权校验层:Spring Security根据你配置的授权规则(比如是否需要登录、是否需要指定角色),读取
SecurityContextHolder中的认证信息做权限判断 - 权限校验通过后,请求才会进入对应的Controller接口
修复建议
- 放开注释的公开接口配置:
http.authorizeRequests().antMatchers("/signin","/signup").permitAll().anyRequest().authenticated() - 保留异常处理器配置,自定义异常的响应格式和状态码
- 优化JWT过滤器逻辑:如果token校验失败,直接往
HttpServletResponse中写入401状态码和错误信息,不要直接抛出未处理的异常
内容的提问来源于stack exchange,提问作者stathis94
相关产品推荐
相关产品推荐

