Spring Security中permitAll不生效,如何正确放行/actuator/**端点?
问题根源
从调试日志和报错信息可以看出:你配置的JwtTokenAuthenticationFilter会拦截所有请求,包括已经通过permitAll()放行的/actuator路径。由于该过滤器在AuthorizationFilter(权限校验过滤器)之前执行,还没到权限判断环节就触发了token校验逻辑,抛出了Invalid token异常,导致/actuator/info请求被拦截。
解决方法
方法1:修改Jwt过滤器,跳过actuator路径校验
在自定义的JwtTokenAuthenticationFilter的doFilterInternal方法开头添加路径判断,直接放行/actuator相关请求:
@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 跳过actuator路径的token校验 if (request.getServletPath().startsWith("/actuator/")) { filterChain.doFilter(request, response); return; } // 原有token校验逻辑... }
方法2:限定Jwt过滤器仅作用于/api路径
在SecurityFilterChain配置中,指定Jwt过滤器只对/api路径生效,不对/actuator路径执行校验:
@Bean public SecurityFilterChain securityWebFilterChain( HttpSecurity http, JwtTokenProvider jwtTokenProvider) throws Exception { // 初始化Jwt过滤器并指定作用路径 JwtTokenAuthenticationFilter jwtFilter = new JwtTokenAuthenticationFilter(jwtTokenProvider); jwtFilter.setFilterProcessesUrl("/api/**"); return http .csrf(AbstractHttpConfigurer::disable) .httpBasic(AbstractHttpConfigurer::disable) .sessionManagement(AbstractHttpConfigurer::disable) .authorizeHttpRequests(authz -> authz .requestMatchers("/actuator/**").permitAll() .requestMatchers("/api/**").hasRole("USER") .anyRequest().authenticated()) .addFilterAt(jwtFilter, UsernamePasswordAuthenticationFilter.class) .build(); }
收尾操作
删除不推荐的WebSecurityCustomizer配置,确保Spring Security使用permitAll的推荐方式处理权限。
内容的提问来源于stack exchange,提问作者pixel
相关产品推荐
相关产品推荐

