Java 删除“;使用默认安全密码";弹簧靴

Java 删除“;使用默认安全密码";弹簧靴,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我在Spring Boot的应用程序中添加了一个自定义的安全配置,但是日志文件中仍然有关于“使用默认安全密码”的消息 有什么方法可以移除它吗?我不需要这个默认密码。Spring Boot似乎没有识别我的安全策略 @Configuration @EnableWebSecurity public class CustomSecurityConfig extends WebSecurityConfigurerAdapter { private final String uri = "/cus

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

有什么方法可以移除它吗?我不需要这个默认密码。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();
    }
}
查阅:

通过查看代码,我看到了下面的内容。此外,如果没有按照提供身份验证管理器,则内存中的配置也是一种后备配置。您先前注入身份验证管理器的尝试将起作用,因为您将不再使用内存中的身份验证,并且该类将无法使用

@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);
    }
@覆盖
public void configure(AuthenticationManagerBuilder auth)引发异常{
if(auth.isConfigured()){
返回;
}
User User=this.securityProperties.getUser();
if(user.isDefaultPassword()){
logger.info(“\n\n使用默认安全密码:”+user.getPassword()
+“\n”);
}
Set roles=newlinkedhashset(user.getRole());
withUser(user.getName()).password(user.getPassword()).roles(
roles.toArray(新字符串[roles.size()]);
setField(auth,“defaultUserDetailsService”,getUserDetailsService());
super.configure(auth);
}

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

我找到了排除安全自动配置的解决方案

例如:

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

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

application.properties
中添加以下内容对我很有效

security.basic.enabled=false

请记住重新启动应用程序并在控制台中进行检查。

尽管它可以工作,但正如一些评论中所指出的,当前的解决方案有点过头了。因此,这里有一个适合我的替代方案,使用最新的Spring Boot(1.4.3)

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

由于我们将当前AuthenticationManager定义为一个bean,因此下面的代码可以防止AuthenticationManager配置内的代码执行

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

}

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

检查org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration的文档自动配置在某些情况下自动配置将停止

在我的例子中,我忘记将我的自定义身份验证提供程序定义为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);
    }
}

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

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.authorizeExchange().anyExchange().permitAll();
    return http.build();
}
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration

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

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.authorizeExchange().anyExchange().permitAll();
    return http.build();
}
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration

参考资料:

使用Spring Boot 2.0.4时,我遇到了相同的问题

排除
SecurityAutoConfiguration.class
会破坏我的应用程序

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


如果要在单独的包中声明配置,则可以使用
@EnableResourceServer
和JWT
:)

, 确保按如下方式添加组件扫描:

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

.....
  • 同时清除浏览器缓存并以匿名模式运行spring boot应用程序

  • 在使用webflux的spring boot 2上,您需要定义一个反应式AuthenticationManager

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


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

    只需使用以下行:

    spring.security.user.name=XXX
    spring.security.user.password=XXX
    
    设置默认安全用户名和密码的步骤 在Spring应用程序上下文中的
    应用程序.properties
    (名称可能不同)

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

    @SpringBootApplication(exclude = {SecurityAutoConfiguration.class })
    

    对于反应堆栈(SpringWebFlux,Netty),您需要排除ReactiveUserDetailsServiceAutoConfiguration.class

    @SpringBootApplication(exclude = {ReactiveUserDetailsServiceAutoConfiguration.class})
    
    或者定义ReactiveAuthenticationManager bean(有不同的实现,这里是JWT的一个示例)


    我遇到了同样的问题,将这一行添加到我的应用程序中。属性解决了这个问题

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

    它是弹簧的一个自动部件,你可以将它排除在外,就像排除其他部件,如执行器一样。我建议查看此

    要删除默认用户,您需要在没有用户的情况下配置authentication menager,例如:

    @configuration
    class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication();
        }
    }
    

    这将删除默认密码消息和默认用户,因为在这种情况下,您将在MemoryAuthentication中配置,并且在接下来的步骤中不会指定任何用户。在Spring Boot 2应用程序中,您可以从自动配置中排除服务配置:

    @EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
    
    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange().anyExchange().permitAll();
        return http.build();
    }
    
    spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
    
    或者,如果您只想在日志中隐藏消息,只需更改日志级别:

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

    更多信息可在此处找到:

    如果您已启用执行器
    功能(弹簧启动启动器执行器),则应在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版中测试。

    您只需要排除UserDetails服务自动配置

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

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

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

    该类是否在正确的包中,因此可以找到?几个月前我犯了这个错误。。。将密码设置为已知值(I a)是否足够