Spring Boot 2.0禁用默认安全性

时间:2017-11-13 21:16:27

标签: spring-boot spring-security spring-webflux spring-security-rest

我想使用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.
    }
}

如何简单地禁用基本安全性?

更新
知道我不是在使用web mvc而是使用web flux。可能会很高兴。

截图:
Basic login form

13 个答案:

答案 0 :(得分:26)

根据Spring 2.0中的新更新,如果Spring Security在类路径上,Spring Boot将添加@EnnWebSecurity.So向application.properties添加条目将无法工作(即它不再可自定义办法)。有关更多信息,请访问官方网站Security changes in Spring Boot 2.0

虽然不确定您的要求,我可以想到一个解决方法,如下所示: -

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

希望这有帮助。

答案 1 :(得分:8)

这对我有用:

@Configuration
public class SecurityConfig  extends WebSecurityConfigurerAdapter {

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

答案 2 :(得分:8)

您可以在Application类中添加/修改以下内容:

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

}

答案 3 :(得分:7)

According to the reference documentation,允许使用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();
    }
}

答案 4 :(得分:3)

从Spring Boot 2.1开始,如果包含spring-boot-actuator,仅排除SecurityAutoconfiguration就不再足够了,还需要排除ManagementWebSecurityAutoConfiguration,如下所示:

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

答案 5 :(得分:1)

我认为您要寻找的是覆盖默认的身份验证入口点,该入口点设置为 BasicAuthenticationEntryPoint

此入口点添加

  

“WWW-Authenticate”:“Basic realm = ...”

标题告诉您的浏览器使用Basic Auth。

答案 6 :(得分:1)

如果我在 application.yml 中将 @ConditionalOnProperty 属性设置为 false 以禁用 spring 安全性,我已经利用 SecurityConfig.java 加载以下 spring.security.enabled 类,并且它的工作原理很吸引人。

@ConditionalOnProperty(name = "spring.security.enabled", havingValue = "false")
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

答案 7 :(得分:0)

在Spring boot 2中,无法通过application.properties文件禁用基本身份验证。但是唯一的事情就是使用注释

@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class})

在主要班级。 有效

答案 8 :(得分:0)

添加一些新的答案,我假设所有人都使用执行器,否则我敢打赌一个类的排除应该足够,我设法通过属性禁用了该功能:

STATIC_URL = '/static/'
STATICFILES_DIRS = [ "cs_viewer/static", ]
STATIC_ROOT="cs_viewer/static"

INSTALLED_APPS += (
    'compressor',
    'compressor_toolkit',
)
STATICFILES_FINDERS = (
    'compressor.finders.CompressorFinder',
)
COMPRESS_CSS_FILTERS = [
    'compressor.filters.css_default.CssAbsoluteFilter',
    'compressor.filters.cssmin.CSSMinFilter',
    'compressor.filters.template.TemplateFilter'
]
COMPRESS_JS_FILTERS = [
    'compressor.filters.jsmin.JSMinFilter',
]
COMPRESS_PRECOMPILERS = (
    ('module', 'compressor_toolkit.precompilers.ES6Compiler'),
    ('css', 'compressor_toolkit.precompilers.SCSSCompiler'),
)
COMPRESS_ENABLED = True

我通过属性引用了两个自动配置类,以保持长度不变(请注意,如果您这样引用IntelliJ Ultimate,它会哭,因为它不知道这些占位符值是什么,如果它们实际上是合法类,因此,如果您感到烦恼,请直接插入。)

但是,应用程序不会按照以下要求启动:

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

如果您只是禁用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

如果它能正常工作,您将不再看到自动生成的密码,并且比接受的答案要少一些混乱,因为在安全允许的情况下,开发人员读取日志不会被基本身份验证的生成密码所混淆。 / p>

为什么仅禁用主要的自动配置类是不够的,因为这个家伙:

SecurityAutoConfiguration

为分割执行器和安全性配置已经做了很多工作,这使我们所有人都感到困惑,现在它更简单了,但是像这样的工件仍然存在。如果我错了,Spring开发人员会纠正我的:-)。

答案 9 :(得分:0)

问题出在org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter

它有private ServerAuthenticationEntryPoint authenticationEntryPoint = new HttpBasicServerAuthenticationEntryPoint();

因此要在ServerHttpSecurity初始化期间对其进行修复,请添加:

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

看起来像香草(servlet)的spring使用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;
    }

旁注:构建器样式bean中的可变字段(例如ExceptionTranslationWebFilter)使Spring代码难以调试(也太不可思议了)

答案 10 :(得分:0)

要禁用 Spring Boot Reactive Web 应用程序的默认安全性,请在类路径中也有执行器时使用以下排除项。

@SpringBootApplication(exclude = {ReactiveSecurityAutoConfiguration.class, ReactiveManagementWebSecurityAutoConfiguration.class })

答案 11 :(得分:0)

您应该添加 @EnableWebSecurity 以启用自定义安全配置。 之后只需禁用表单登录

@Configuration
@EnableWebSecurity
public class StackWebSecurityConfigurerAdapter extends 
WebSecurityConfigurerAdapter {
 @Override
 protected void configure(HttpSecurity http) throws Exception {
    http.formLogin().disable();
 }

}

答案 12 :(得分:-1)

如果要扩展WebSecurityConfigurerAdapter,则可以将true传递给超级构造函数以禁用默认值。
如果这样做,您可能需要提供其他bean。

    /**
     * Creates an instance which allows specifying if the default configuration should be
     * enabled. Disabling the default configuration should be considered more advanced
     * usage as it requires more understanding of how the framework is implemented.
     *
     * @param disableDefaults true if the default configuration should be disabled, else
     * false
     */
    protected WebSecurityConfigurerAdapter(boolean disableDefaults) {
        this.disableDefaults = disableDefaults;
    }

如果您仅出于测试目的而将其禁用- 除了完全禁用自动配置之外,我还创建了“ SecurityConfiguration”之外的“ InsecurityConfiguration”,并使用Spring Profile或Property值将其激活。

从技术上讲,安全性仍处于配置状态,但仍处于开放状态。

@Configuration
@ConditionalOnProperty(prefix = "security", value = "disabled", havingValue = "true")
public class InsecurityConfiguration extends WebSecurityConfigurerAdapter {

    private final static Logger log = LoggerFactory.getLogger(InsecurityConfiguration.class);

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        log.warn("configuring insecure HttpSecurity");
        http.authorizeRequests().anyRequest().permitAll();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        log.warn("configuring insecure WebSecurity");
        web.ignoring().antMatchers("/**");
    }

}

注意这是针对mvc而非webflux。对于Webflux,您应该创建一个SecurityWebFilterChain,如Bryan所述。

这是使用JWT时通常在webflux中禁用基本身份验证的方式-

    @Bean
    public SecurityWebFilterChain configure(ServerHttpSecurity http) {

        http
        .authorizeExchange().anyExchange().authenticated().and()
            .httpBasic().disable()
            .formLogin().disable()
            .logout().disable()
            .oauth2ResourceServer()
            .jwt()
            .and()
                .and().exceptionHandling().accessDeniedHandler(problemSupport);
        return http.build();
    }