Spring Boot 2.0 отключает защиту по умолчанию

Я хочу использовать Spring Security для аутентификации JWT. Но это идет с аутентификацией по умолчанию. Я пытаюсь отключить его, но старый способ сделать это - отключить его через application.properties - устарел в 2.0.

Вот что я попробовал:

@Configuration
public class StackWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.httpBasic().disable();
        // http.authorizeRequests().anyRequest().permitAll(); // Also doesn't work.
    }
}

Как я могу просто отключить базовую безопасность?

ОБНОВИТЬ
Было бы неплохо знать, что я не использую веб-MVC, а веб-поток.

Скриншот:
Basic login form

Ответ 1

Согласно новым обновлениям Spring 2.0, если Spring Security находится в пути к классам, Spring Boot добавит @EnableWebSecurity. Так что добавление записей в application.properties не будет работать (т.е. Оно больше не настраивается таким образом). Для получения дополнительной информации посетите официальный сайт Изменения безопасности в Spring Boot 2.0

Хотя я точно не уверен в ваших требованиях, я мог бы подумать об одном обходном пути, таком как:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration  extends WebSecurityConfigurerAdapter{
    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests().antMatchers("/").permitAll();
    }
}

Надеюсь это поможет.

Ответ 2

Согласно справочной документации конфигурация безопасности для разрешения всех запросов с помощью WebFlux должна выглядеть так:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.web.server.SecurityWebFilterChain;

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange().anyExchange().permitAll();
        return http.build();
    }
}

Ответ 3

Вы можете добавить/изменить следующее в свой класс Application:

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class MyApplication {

}

Ответ 4

Начиная с Spring Boot 2.1, если вы включили Spring-boot-привод, больше не достаточно исключать только SecurityAutoconfiguration, вам также необходимо исключить ManagementWebSecurityAutoConfiguration, например:

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class })

Ответ 5

Это сработало для меня:

@Configuration
public class SecurityConfig  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().authorizeRequests().anyRequest().permitAll();
    }
}

Ответ 6

Я думаю, что вы ищете, чтобы переопределить точку входа для проверки подлинности по умолчанию, которая установлена в BasicAuthenticationEntryPoint.

Эта точка входа добавляет

"WWW-Authenticate": "Основная область =..."

который указывает браузеру использовать Basic Auth.

Ответ 7

Добавляя какой-то свежий ответ, я предполагаю, что все используют привод, если бы я не поспорил, что одного класса исключения должно быть достаточно, мне удалось отключить через свойства:

spring:
  autoconfigure:
    exclude: ${spring.autoconfigure.sac}, ${spring.autoconfigure.mwsas}
    sac: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
    mwsas: org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration

Я сослался на два класса автоконфигурации через свойство, чтобы сохранить длину неизменной (обратите внимание, что IntelliJ Ultimate будет плакать, если вы так на него ссылаетесь, поскольку он понятия не имеет, что это за значения-заполнители и действительно ли они являются допустимыми классами, поэтому встроенный, если что тебя раздражает).

Однако приложение не может запуститься, как утверждают:

https://www.baeldung.com/spring-boot-security-autoconfiguration

если вы просто отключите SecurityAutoConfiguration

Если это сработало, вы перестанете видеть автоматически сгенерированный пароль, и это будет немного менее запутанным, чем принятый ответ, так как чтение чтения журнала не будет смущено сгенерированным паролем для базовой аутентификации, в то время как безопасность разрешает все.

Почему просто отключить основной класс автоконфигурации недостаточно из-за этого парня:

@Configuration
class ManagementWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .requestMatchers(
                        EndpointRequest.to(HealthEndpoint.class, InfoEndpoint.class))
                .permitAll().anyRequest().authenticated().and().formLogin().and()
                .httpBasic();
    }

}

Была проделана тонна работы по разделению конфигурации привода и безопасности, которая смутила нас всех, теперь она более прямолинейна, но подобные артефакты все еще существуют. Весенние разработчики меня поправят, если я ошибаюсь :-).

Ответ 8

В Spring boot 2 нет способа отключить базовую аутентификацию с помощью файла application.properties. Но единственное, это использовать аннотации

@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class})

в основном классе. Оно работает

Ответ 9

Проблема связана с org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter

у него есть private ServerAuthenticationEntryPoint authenticationEntryPoint = new HttpBasicServerAuthenticationEntryPoint();

чтобы исправить это во время инициализации ServerHttpSecurity, добавьте:

http.exceptionHandling().authenticationEntryPoint(HttpStatusServerEntryPoint(HttpStatus.FORBIDDEN))

Похоже, пружина vanilla (servlet) использует org.springframework.security.config.annotation.web.configurers.ExceptionHandlingConfigurer # createDefaultEntryPoint

private AuthenticationEntryPoint createDefaultEntryPoint(H http) {
        if (this.defaultEntryPointMappings.isEmpty()) {
            return new Http403ForbiddenEntryPoint();
        }
        if (this.defaultEntryPointMappings.size() == 1) {
            return this.defaultEntryPointMappings.values().iterator().next();
        }
        DelegatingAuthenticationEntryPoint entryPoint = new DelegatingAuthenticationEntryPoint(
                this.defaultEntryPointMappings);
        entryPoint.setDefaultEntryPoint(this.defaultEntryPointMappings.values().iterator()
                .next());
        return entryPoint;
    }

Примечание: изменяемые поля в компонентах стиля компоновщика (например, ExceptionTranslationWebFilter) затрудняют отладку весеннего кода (также слишком волшебная конфигурация)