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

时间:2015-06-10 15:48:54

标签: java spring spring-boot spring-security

我在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();
    }
}

20 个答案:

答案 0 :(得分:59)

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

示例:

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

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

答案 1 :(得分:37)

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

security.basic.enabled=false

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

答案 2 :(得分:27)

虽然它有效,但是正如一些评论中所指出的那样,目前的解决方案有点矫枉过正。所以这里有一个替代方案,适用于我,使用最新的Spring Boot(1.4.3)。

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

以下代码可以防止在AuthenticationManagerConfiguration中执行代码,因为我们将当前的AuthenticationManager定义为bean。

@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();
}

}

答案 3 :(得分:8)

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

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

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

@EnableResourceServer和JWT :)一起正常工作

答案 4 :(得分: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的记录器配置并删除此消息。

答案 5 :(得分: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

答案 6 :(得分:2)

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

@configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

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

答案 7 :(得分:1)

如果您启用了 actuator 功能(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中测试。

答案 8 :(得分:1)

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

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

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

答案 9 :(得分:1)

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

  fetch: typeof fetch === "function" ? fetch : (() => {}),

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

@SpringBootApplication(exclude = {ReactiveUserDetailsServiceAutoConfiguration.class})

答案 10 :(得分:0)

只需将以下属性添加到 application.properties

spring.security.user.name=xyz
spring.security.user.password=xxxxxxx

答案 11 :(得分:0)

您只需要排除 UserDetailsS​​erviceAutoConfiguration。

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

答案 12 :(得分:0)

只需使用以下行:

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

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

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

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

答案 15 :(得分: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

答案 16 :(得分: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

答案 17 :(得分:0)

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

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })

答案 18 :(得分:0)

检查 org.springframework.boot.autoconfigure.security.servlet.UserDetailsS​​erviceAutoConfiguration 的文档,当autoconfig停止时有条件。

在我的情况下,我忘了将自定义 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);
    }
}

答案 19 :(得分:0)

当使用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();
        }
    }