401 по запросу, где указано » PermitAll ()»

#java #spring #spring-boot #security #spring-security

Вопрос:

У меня есть эта конфигурация WebSecurityConfigurerAdapter:

 @EnableWebSecurity
public class HttpSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.cors()
                .and()
                .authorizeRequests()

                .mvcMatchers("/auth/**").permitAll()

                .anyRequest().authenticated()

                .and()
                .oauth2ResourceServer().jwt()
        ;
    }
}

 

Когда я делаю запрос auth , я получаю 401, пока не пройду какое — либо разрешение, которое не подходит для этого эндопинта.

Я бы предположил, что это как-то связано с .anyRequest().authenticated() этим . Я уже читал раньше, что это не должно повлиять на permitAll() s — я что-то неправильно настроил?

Комментарии:

1. У вас есть пример пути, который возвращает 401

2. Вы аннотировали свой класс конфигурации с помощью @EnableWebSecurity ?

3. @AkifHadziabdic «СООБЩЕНИЕ /авторизация/тест»

4. @Nemanja да org.springframework.security.config.annotation.web.configuration.EnableWebSecurity

Ответ №1:

Ваш запрос, вероятно, отклоняется, потому что вы не предоставили маркер CSRF. По умолчанию Spring Security включает его для каждого POST запроса, и вам необходимо явно отключить его.

 @EnableWebSecurity
public class HttpSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.cors()
                .and()
                .csrf().disable()
                .authorizeRequests()
                .mvcMatchers("/auth/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .oauth2ResourceServer().jwt();
    }
}

 

Вы можете добавить следующее свойство в свой application.yml файл, чтобы вы могли видеть, почему ваш запрос отклоняется, если CSRF не соответствует действительности:

 logging:
  level:
    org.springframework.security: TRACE
 

Комментарии:

1. В этом и заключалась на самом деле проблема

Ответ №2:

Если вы используете фильтр jwt,он не будет работать, даже если вы добавили PermitAll() .если вы удалите фильтр, он будет работать нормально.

Комментарии:

1. Единственный обходной путь, который я знаю, — это игнорировать HttpMethod. ОПУБЛИКОВАТЬ, поэтому все URL-адреса с использованием метода POST будут игнорироваться.

2. Вы можете взглянуть на это github.com/spring-projects/spring-security/issues/4368 Похоже, есть и другие обходные пути