在Spring Boot上删除“使用默认安全密码”


77

我在Spring Boot的应用程序中添加了一个自定义安全配置,但是有关“使用默认安全密码”的消息仍在LOG文件中。

有什么要删除的吗?我不需要此默认密码。看来Spring Boot无法识别我的安全策略。

@Configuration
@EnableWebSecurity
public class CustomSecurityConfig extends WebSecurityConfigurerAdapter {

    private final String uri = "/custom/*";

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        http.csrf().disable();
        http.headers().httpStrictTransportSecurity().disable();
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

        // Authorize sub-folders permissions
        http.antMatcher(uri).authorizeRequests().anyRequest().permitAll();
    }
}

1
此类是否在正确的包装中,因此可以找到?几个月前我犯了这个错误……将密码设置为已知值就足够了(我认为不是...)?
6

也许您有和我一样的类似问题。我很幸运,Syer先生给我的答案;-) stackoverflow.com/questions/27981681/...
Marged

还有另一个配置类,可导入此安全配置@Import({CustomSecurityConfig .class})。该类由Spring Boot扫描,在另一例与CAS安全有关的情况下,我注意到了这一点,Spring Boot仅在我执行@Inject public void configureGlobal(final AuthenticationManagerBuilder authenticationManagerBuilder)引发异常时才删除此消息{
Carlos Alberto 2015年

2
我尝试添加security.basic.enabled = false,但没有任何改变。
卡洛斯·阿尔贝托

Answers:


72

我找到了关于排除SecurityAutoConfiguration类的解决方案。

例:

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

    public static void main(String[] args) throws Exception {
        SpringApplication.run(MyApplication.class, args);
    }
}

此解决方案的唯一不便之处在于,它禁用了从application.properties读取安全属性的功能,因此您必须在此之后进行控制。
卡洛斯·阿尔贝托

25
我想知道:将Spring Security添加到Boot并具有禁用所有功能的意义是什么呢?即使考虑仅关闭日志记录?您想要安全吗?我认同。您是否需要默认的生成密码?也许不……那为什么不指定一个呢?只需使用以下属性:security.user.name = user#默认用户名。security.user.password =#默认用户名的密码。默认情况下,在启动时会记录一个随机密码。或运行您自己的UserDetailsS​​ervice…
Michael Simons

@MichaelSimons ...感谢您的回答。最好将其存储在属性文件中而不是在日志中。在这种情况下,您也可以对其进行加密。再次感谢。
Atul

2
@MichaelSimons例如,在我正在进行的项目中,我们仅使用第三方用户池-AWS Cognito。因此,我们根本不需要Spring的自动配置的用户服务。我们仅使用Cognito提供的令牌。因此,我只是从应用程序中排除了ReactiveUserDetailsS​​erviceAutoConfiguration.class(因为我们使用了webflux)
alexkov

一个完全错误的答案的一个很好的例子,它具有数百万个得分点
amseager

38

添加以下内容application.properties对我有用,

security.basic.enabled=false

请记住重新启动应用程序并在控制台中签入。


1
只需在此处分享我的解决方法management.security.enabled=false,而我正在使用Spring 1.5.4 RELEASE。
suiwenfeng

9
从(至少)Spring Boot 2开始,此功能不再起作用。
Tobias '18

1
@Tobias是的,你是对的。您是否有针对Spring Boot 2的解决方案?
mor222 '18

@ mor222下面的Stefan解决方案为我做到了。
Tobias

@ mor222我在答案中添加了另一个对我有用的选项。stackoverflow.com/a/51414492/1195507我正在使用Spring Boot 2.0
rvazquezglez '18

34

使用Spring Boot 2.0.4,我遇到了同样的问题。

排除SecurityAutoConfiguration.class确实破坏了我的应用程序。

现在我正在使用 @SpringBootApplication(exclude= {UserDetailsServiceAutoConfiguration.class})

@EnableResourceServer与JWT兼容:)


2
您能否解释在哪里编写此代码?以及“与@EnableResourceServer和JWT正常工作”是什么意思(对Spring Boot和jwt来说是新的)谢谢!
杰尔

对我来说,它使用@EnableAutoConfiguration而不是@SpringBootApplication(SpringBoot 2.3.0)进行了排除: @SpringBootApplication @EnableAutoConfiguration(exclude={UserDetailsServiceAutoConfiguration.class}) public class MainAppClassName { ... }
Felipe de Alvarenga Leite

@EnableAutoConfiguration是的一部分@SpringBootApplication
jump_monkey '20

31

尽管可行,但如一些评论中所述,当前解决方案有些过头了。因此,这是使用最新的Spring Boot(1.4.3)对我有用的替代方法。

默认的安全密码是在Spring Boot的AuthenticationManagerConfiguration类中配置的。如果已经定义了AuthenticationManager Bean,则此类具有条件注释以防止加载。

由于我们将当前的AuthenticationManager定义为bean,因此以下代码可防止AuthenticationManagerConfiguration内部的代码执行。

@Configuration
@EnableWebSecurity
public class MyCustomSecurityConfig extends WebSecurityConfigurerAdapter{

[...]

@Override
protected void configure(AuthenticationManagerBuilder authManager) throws Exception {
    // This is the code you usually have to configure your authentication manager.
    // This configuration will be used by authenticationManagerBean() below.
}

@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
    // ALTHOUGH THIS SEEMS LIKE USELESS CODE,
    // IT'S REQUIRED TO PREVENT SPRING BOOT AUTO-CONFIGURATION
    return super.authenticationManagerBean();
}

}

@EnableWebSecurity不需要使其工作
Pierrefevrier

6

对于Reactive Stack(Spring Webflux,Netty),您需要排除ReactiveUserDetailsS​​erviceAutoConfiguration.class

@SpringBootApplication(exclude = {ReactiveUserDetailsServiceAutoConfiguration.class})

或定义ReactiveAuthenticationManager bean(有不同的实现,这里是JWT的一个示例)

@Bean
public ReactiveJwtDecoder jwtDecoder() {
    return new NimbusReactiveJwtDecoder(keySourceUrl);
}
@Bean
public ReactiveAuthenticationManager authenticationManager() {
    return new JwtReactiveAuthenticationManager(jwtDecoder());
}

3

查找:http : //docs.spring.io/spring-boot/docs/current/reference/html/boot-features-security.html

AuthenticationManagerConfiguration.java中查看代码,我看到以下内容。如果没有按照Javadoc提供身份验证管理器,则内存中配置也是一个备用。您之前尝试注入身份验证管理器的尝试将起作用,因为您将不再使用内存中身份验证,并且此类将不可用。

@Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        if (auth.isConfigured()) {
            return;
        }
        User user = this.securityProperties.getUser();
        if (user.isDefaultPassword()) {
            logger.info("\n\nUsing default security password: " + user.getPassword()
                    + "\n");
        }
        Set<String> roles = new LinkedHashSet<String>(user.getRole());
        withUser(user.getName()).password(user.getPassword()).roles(
                roles.toArray(new String[roles.size()]));
        setField(auth, "defaultUserDetailsService", getUserDetailsService());
        super.configure(auth);
    }

如果您使用默认的内存身份验证,请为org.springframework.boot.autoconfigure.security.AuthenticationManagerConfiguration定制记录器配置,并删除此消息。


如您所说,我已经覆盖了我的configure方法,并且Spring消息仍然显示。在一个不使用Boot的简单Spring MVC应用程序中,有趣的是它可以正常工作。问题与Spring Boot有关,请看一下添加到我的CustomSecurityConfig中的代码以重写该方法:@Override public void configure(AuthenticationManagerBuilder auth)引发异常{}
Carlos Alberto 2015年

3

只需使用以下行:

spring.security.user.name=XXX
spring.security.user.password=XXX

application.properties在Spring Application上下文中为您设置默认的安全用户名和密码(名称可能有所不同)。

为了完全避免默认配置(作为SpringBoot自动配置的一部分),请使用前面“答案”中提到的方法:

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })

要么

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })

3

在Spring Boot 2应用程序中,您可以从自动配置中排除服务配置:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration

或者,如果您只想在日志中隐藏消息,则只需更改日志级别即可:

logging.level.org.springframework.boot.autoconfigure.security=WARN

可以在这里找到更多信息:https : //docs.spring.io/spring-boot/docs/2.0.x/reference/html/boot-features-security.html


2

当使用spring boot时,我们应该在应用程序类中以及确切地在其中配置安全性的地方都排除SecurityAutoConfiguration.class,如下所示。

只有这样我们才能避免使用默认的安全密码。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })
@EnableJpaRepositories
@EnableResourceServer
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

    @Configuration
    @EnableWebSecurity
    @EnableAutoConfiguration(exclude = { 
            org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration.class 
        })
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity httpSecurity) throws Exception {
            httpSecurity.authorizeRequests().anyRequest().authenticated();
            httpSecurity.headers().cacheControl();
        }
    }

2

要删除默认用户,您需要配置不包含用户的身份验证管理员,例如:

@configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication();
    }
}

这将删除默认密码消息和默认用户,因为在这种情况下,您正在配置InMemoryAuthentication,并且在后续步骤中将不指定任何用户


1

当我使用@SpringBootApplication批注排除SecurityAutoConfiguration时,它对我不起作用,但是当我在@EnableAutoConfiguration中排除它时,它确实对我有用:

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })

1

我遇到了同样的问题,并将此行添加到我的application.properties中解决了该问题。

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration

它是Spring的自动零件之一,您可以像排除其他零件(例如执行器)一样将其排除在外。我建议看这个链接


1

如果启用了执行器功能(spring-boot-starter-actuator),则应在application.yml中添加其他排除项:

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration

在Spring Boot版本2.3.4.RELEASE中进行了测试。


0

查看org.springframework.boot.autoconfigure.security.servlet.UserDetailsS​​erviceAutoConfiguration的文档,其中有一些条件会导致自动配置停止。

就我而言,我忘记将自定义AuthenticationProvider定义为bean

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(getAuthenticationProvider());
    }

    @Bean
    AuthenticationProvider getAuthenticationProvider() {
        return new CustomAuthenticationProvider(adminService, onlyCorporateEmail);
    }
}

0

如果您使用的是Spring Boot版本> = 2.0,请尝试在配置中设置此bean:

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

参考:https : //stackoverflow.com/a/47292134/1195507


0

如果要在单独的软件包中声明配置,请确保添加组件扫描如下:

@SpringBootApplication
@ComponentScan("com.mycompany.MY_OTHER_PACKAGE.account.config")

    public class MyApplication {

        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }



    }

您可能还需要在config类中添加@component注释,如下所示:

  @Component
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()

.....
  1. 还要清除浏览器缓存并以隐身模式运行spring boot app

0

在使用webflux的Spring Boot 2上,您需要定义一个ReactiveAuthenticationManager


0

也可以只关闭属性中该特定类的日志记录:

logging.level.org.springframework.boot.autoconfigure.security.AuthenticationManagerConfiguration=WARN

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.