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

Car*_*rto 58 java spring spring-security spring-boot

我在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Car*_*rto 66

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

例:

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

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

  • 我想知道:将Spring Security添加到Boot中有什么意义,它实际上具有良好的自动配置而不是禁用所有内容?即使只考虑关闭日志记录?你想要安全吗?我认同.您想要一个默认生成的密码吗?也许不...那么你为什么不指定一个呢?只需使用这些属性:security.user.name = user#默认用户名.security.user.password =#默认用户名的密码.默认情况下,在启动时会记录随机密码.或运行自己的UserDetailsS​​ervice ... (17认同)
  • 一个完全错误的答案有数百万分的好例子 (11认同)
  • @MichaelSimons 例如,在我正在进行的项目中,我们仅使用第 3 方用户池 - AWS Cognito。所以我们根本不需要Spring的自动配置用户服务。我们仅使用 Cognito 提供的令牌。所以我只是从应用程序中排除了 ReactiveUserDetailsS​​erviceAutoConfiguration.class (因为我们使用 webflux) (3认同)
  • 这是用锤子打开花生。删除 SecurityAutoConfig 会消除所有安全自动配置,这比原始问题中所要求的要多。请参阅有关提供您自己的 InMemoryAuthentication 提供程序、添加用户/密码属性或显式创建 AuthenticationManager bean 的其他响应,所有这些都侧重于默认用户。 (2认同)

mpk*_*nje 41

所以这个问题的大多数答案都建议:

  • 排除一些自动配置
  • 设置用户和/或密码

然而,排除自动配置几乎不是答案。如果您的应用程序没有任何用户,那么第二个解决方案也不是很好。

相反,我们应该使用 Spring Boot。

生成日志消息是为了UserDetailsServiceAutoConfiguration让我们知道 Spring Boot 设置了合理的默认值。查看源代码和文档UserDetailsServiceAutoConfiguration我们可以看到:

/**
 * {@link EnableAutoConfiguration Auto-configuration} for a Spring Security in-memory
 * {@link AuthenticationManager}. Adds an {@link InMemoryUserDetailsManager} with a
 * default user and generated password. This can be disabled by providing a bean of type
 * {@link AuthenticationManager}, {@link AuthenticationProvider} or
 * {@link UserDetailsService}.
 *
 * @author Dave Syer
 * @author Rob Winch
 * @author Madhura Bhave
 * @since 2.0.0
 */
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(AuthenticationManager.class)
@ConditionalOnBean(ObjectPostProcessor.class)
@ConditionalOnMissingBean(
        value = { AuthenticationManager.class, AuthenticationProvider.class, UserDetailsService.class,
                AuthenticationManagerResolver.class },
        type = { "org.springframework.security.oauth2.jwt.JwtDecoder",
                "org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector",
                "org.springframework.security.oauth2.client.registration.ClientRegistrationRepository" })
public class UserDetailsServiceAutoConfiguration {
Run Code Online (Sandbox Code Playgroud)

我们可以看到,UserDetailsServiceAutoConfiguration当提供以下任何 bean 时, 会被禁用:AuthenticationManagerAuthenticationProviderUserDetailsService AuthenticationManagerResolver

这意味着当告诉 Spring Boot 我们希望如何对用户进行身份验证时,Spring Boot 将不会自动配置合理的默认值。由于我们不想验证任何用户,因此我们可以提供:

@Configuration
public class ApplicationConfiguration {

    @Bean
    public AuthenticationManager noopAuthenticationManager() {
        return authentication -> {
            throw new AuthenticationServiceException("Authentication is disabled");
        };
    }
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*cky 40

添加以下内容application.properties为我工作,

security.basic.enabled=false
Run Code Online (Sandbox Code Playgroud)

记得重新启动应用程序并检查控制台.

  • 从(至少)Spring Boot 2开始,这不再适用. (8认同)

Ste*_*fan 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();
}

}
Run Code Online (Sandbox Code Playgroud)


Ben*_*n M 22

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

排除SecurityAutoConfiguration.class确实破坏了我的申请.

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

正常工作与@EnableResourceServer和智威汤逊:)

  • 你能解释一下在哪里写这段代码吗?以及“与@EnableResourceServer 和 JWT 配合良好”的意思(我是 Spring Boot 和 jwt 的新手)谢谢! (2认同)

Nic*_*ick 17

您只需排除 UserDetailsS​​erviceAutoConfiguration。

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
Run Code Online (Sandbox Code Playgroud)


Nik*_*ani 13

我们应该从 Spring Boot 自动配置中排除 UserDetailsS​​erviceAutoConfiguration.class 来解决这个问题

例子:

@SpringBootApplication(exclude = {UserDetailsServiceAutoConfiguration.class })
public class MyClass {

public static void main(String[] args) {
    SpringApplication.run(MyClass.class, args);
}
Run Code Online (Sandbox Code Playgroud)


Daw*_*ski 10

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

@configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication();
    }
}
Run Code Online (Sandbox Code Playgroud)

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


ale*_*kov 7

对于反应堆栈(Spring Webflux,Netty),您要么需要排除 ReactiveUserDetailsS​​erviceAutoConfiguration.class

@SpringBootApplication(exclude = {ReactiveUserDetailsServiceAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)

或者定义 ReactiveAuthenticationManager bean(有不同的实现,这里以 JWT 为例)

@Bean
public ReactiveJwtDecoder jwtDecoder() {
    return new NimbusReactiveJwtDecoder(keySourceUrl);
}
@Bean
public ReactiveAuthenticationManager authenticationManager() {
    return new JwtReactiveAuthenticationManager(jwtDecoder());
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*erl 7

这里的很多答案实际上是试图针对 Spring Boot 而不是使用框架

如果您没有任何本地用户 - 例如因为身份验证是通过 JWT 令牌专门管理的 - 只需告诉 Spring Boot 即可。

声明一个空UserDetailsService作为您的一部分SecurityConfiguration,而不是尝试排除自动配置的一部分,或在以下位置设置不必要的默认用户/密码application.properties

@Configuration
@EnableWebSecurity
class SecurityConfiguration {

   @Bean
   UserDetailsService emptyDetailsService() {
       return username -> { throw new UsernameNotFoundException("no local users, only JWT tokens allowed"); };
   }

   // rest of your security config

}
Run Code Online (Sandbox Code Playgroud)


小智 6

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

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration
Run Code Online (Sandbox Code Playgroud)

或者,如果您只想隐藏日志中的消息,您可以简单地更改日志级别:

logging.level.org.springframework.boot.autoconfigure.security=WARN
Run Code Online (Sandbox Code Playgroud)

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


小智 5

只需使用以下行:

spring.security.user.name=XXX
spring.security.user.password=XXX
Run Code Online (Sandbox Code Playgroud)

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

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

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })
Run Code Online (Sandbox Code Playgroud)

或者

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
Run Code Online (Sandbox Code Playgroud)