为什么我在使用Spring Security 6、permitAll和禁用CSRF后会收到401?

fnatzsnv  于 2023-02-04  发布在  Spring
关注(0)|答案(2)|浏览(232)

有一些类似的问题,所以我尽了最大努力来表明差异,但我已经审查了他们,他们似乎不符合我的问题。
我有几个简单的使用案例...

Given I am a user 
And I am not authenticated
When I use a GET request
Then I get a 200 response

Given I am a user 
And I am not authenticated
When I User a POST request
Then I get a 401 response

我试着用这样的Spring安全装置来工作...

@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((authorize) -> authorize
                .requestMatchers(HttpMethod.GET).permitAll()
                .anyRequest().authenticated()
        ).csrf().disable();
        return http.build();
    }

但是当我运行并尝试使用GET请求命中http://localhost:8080时,我仍然得到401。如果我从POM中删除所有依赖项,那么它会返回给我200。
我错过了什么我需要什么才能允许请求在没有令牌的情况下通过?
我也试过这个...

@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((authorize) -> authorize
                .anyRequest().permitAll()
        ).oauth2ResourceServer( OAuth2ResourceServerConfigurer::jwt );
        return http.build();
    }

但这也提供了401

7uhlpewt

7uhlpewt1#

您提供的第一个安全配置旨在匹配“每个GET请求”。方法签名是requestMatchers(HttpMethod method, String... patterns)。您的用法省略了模式,因此匹配“没有GET请求”。

**注意:**我真的很惊讶这个方法不允许你为patterns参数传递参数,也许这是一个值得的改进建议。

在您的示例中,可以执行以下操作:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((authorize) -> authorize
                .requestMatchers(HttpMethod.GET, "/**").permitAll()
                .anyRequest().authenticated()
            )
            .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
        return http.build();
    }

}

注意:您至少需要指定一个身份验证机制,而您的配置中缺少该机制。

j9per5c4

j9per5c42#

这似乎是工作...

@Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests(authorize -> authorize
                        .requestMatchers("/").permitAll()
                        .anyRequest().authenticated()
                )
                .oauth2ResourceServer(oauth2 -> oauth2
                        .jwt(Customizer.withDefaults())
                );
        return http.build();
    }

相关问题