Spring Security requestMatchers(“”).permitAll()不起作用

a1o7rhls  于 2023-03-18  发布在  Spring
关注(0)|答案(1)|浏览(952)

我正在尝试使用Sping Boot 安全性实现控制器身份验证。
当定制我的filterChain时,我得到401未经授权的资源,我已经特别允许。

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .cors()
            .and()
        .csrf().disable()
        .exceptionHandling()
            .authenticationEntryPoint(unauthorizedHandler)
            .and()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .authorizeHttpRequests()
            .requestMatchers("/api/auth/**").permitAll()
            .requestMatchers("/api/test/**").permitAll()
            .requestMatchers(h2ConsolePath + "/**").permitAll()
            .anyRequest().authenticated();

        http
            .headers()
                .frameOptions().sameOrigin();

        http
            .authenticationProvider(authenticationProvider());

        http
            .addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }

例如,我想访问我的h2-console,但我不想在访问h2-console时进行任何身份验证,但我仍然收到一条错误消息,状态代码为403 Forbidden。
甚至当我删除.anyRequest().authenticated();这一行时,我也会得到同样的错误,这让我认为整个过滤器链可能没有得到应用?但是当我调试它并在方法内部设置断点时,程序会跳到方法内部,所以它应该得到应用?经过许多小时的研究,我不确定如何继续。

编辑:

我还添加了一个TestController,它带有TestResource,但没有@PreAuthorize注解,当我在Postman中测试它时,我得到了以下错误消息:
访问此资源需要完全身份验证
正如已经提到的,我有一种感觉,过滤器链没有应用,因为即使当我删除.anyRequest().authenticated相同的错误仍然发生,所以它对我来说没有意义。

0s0u357o

0s0u357o1#

所以经过几个小时的痛苦和折磨,我终于找到了解决办法。我回到Java 1. 8版,使用antMatchers而不是requestMatchers
这是我最后的代码

@Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .cors()
            .and()
        .csrf().disable()
        .exceptionHandling()
            .authenticationEntryPoint(unauthorizedHandler)
            .and()
        .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
        .authorizeHttpRequests()
            .antMatchers("/api/auth/**").permitAll()
            .antMatchers("/api/test/**").permitAll()
            .antMatchers(h2ConsolePath + "/**").permitAll()
            .anyRequest().authenticated();
    
    http
        .headers()
            .frameOptions().sameOrigin();
    
    http
        .authenticationProvider(authenticationProvider());

    http
        .addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
    
    return http.build();
  }

相关问题