itsource

스프링 부트 시 "기본 보안 비밀번호 사용" 삭제

mycopycode 2022. 9. 11. 17:41
반응형

스프링 부트 시 "기본 보안 비밀번호 사용" 삭제

Spring Boot에서 어플리케이션에 커스텀보안 설정을 1개 추가했는데 "Using default security password"라는 메시지가 아직 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();
    }
}

보안 제외에 대한 해결책을 찾았습니다.AutoConfiguration 클래스

예:

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

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

Spring Boot 2.0.4에서도 같은 문제가 발생하였습니다.

제외SecurityAutoConfiguration.class내 지원서를 파기했어

지금 사용하고 있습니다.@SpringBootApplication(exclude= {UserDetailsServiceAutoConfiguration.class})

@EnableResourceServer JWT » JWT:)

추가application.properties

security.basic.enabled=false

애플리케이션을 재기동해, 콘솔에서 체크 인 하는 것을 잊지 말아 주세요.

효과는 있지만, 일부 코멘트에서 지적된 바와 같이 현재의 솔루션은 약간 과잉입니다.여기에서는 최신 스프링 부트(1.4.3)를 사용하여 사용할 수 있는 다른 방법이 있습니다.

기본 보안 비밀번호는 Spring Boot의 Authentication Manager Configuration 클래스 내에서 설정됩니다.이 클래스에는 Authentication Manager Bean이 이미 정의되어 있는 경우 로드를 방지하기 위한 조건부 주석이 있습니다.

현재 Authentication Manager를 빈으로 정의하기 때문에 다음 코드는 Authentication Manager Configuration 내에서 코드가 실행되지 않도록 합니다.

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

}

Reactive Stack(Spring Webflux, Netty)의 경우 Reactive User Details Service를 제외해야 합니다.AutoConfiguration.class

@SpringBootApplication(exclude = {ReactiveUserDetailsServiceAutoConfiguration.class})

또는 리액티브의 정의Authentication Manager bean(다양한 구현이 있습니다.다음은 JWT의 예를 제시하겠습니다)

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

기본 사용자를 삭제하려면 사용자가 없는 인증 매니저를 설정해야 합니다.다음은 예를 제시하겠습니다.

@configuration
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

이 경우 InMemory를 설정하기 때문에 기본 비밀번호 메시지와 기본 사용자가 삭제됩니다.인증 및 다음 단계에서 사용자를 지정하지 않습니다.

다음 행을 사용합니다.

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

합니다.application.properties(서양속담, 서양속담)

Spring Boot 자동 설정의 일부로서 디폴트 설정을 회피하려면 , 앞의 회답에 기재된 어프로치를 사용합니다.

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })

또는

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })

Spring Boot 2 어플리케이션에서는 서비스 Configuration을 자동 Configuration에서 제외할 수 있습니다.

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 를 참조해 주세요.

User Details Service만 제외하면 됩니다.자동 설정

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

따라서 이 질문에 대한 대부분의 답변은 다음 중 하나를 권장합니다.

  • 일부 자동 구성 제외
  • 사용자 및/또는 비밀번호 설정

그러나 자동 설정을 제외하는 것은 결코 답이 되지 않습니다.또, 애플리케이션에 유저가 없는 경우는, 2번째의 솔루션도 좋지 않습니다.

대신 Spring Boot로 작업해야 합니다.

는 로그 메시지를 한다.UserDetailsServiceAutoConfiguration스프링 부츠 ,, 음, 음, 음, 음, 음, ation, ation, ation, ation, ation, ation, , ation, ation, ation, ation, ation, ation, ation, ation,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 {

「 」라고 하는 을 알 수 .UserDetailsServiceAutoConfiguration 중 됩니다.AuthenticationManager,AuthenticationProvider,UserDetailsService , 「」 AuthenticationManagerResolver.

즉, Spring Boot에 사용자 인증 방법을 전달해도 Spring Boot은 적절한 기본값을 자동 설정하지 않습니다.사용자 인증을 원하지 않기 때문에 다음을 제공할 수 있습니다.

@Configuration
public class ApplicationConfiguration {

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

조회: http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-security.html

Authentication Manager Configuration.java에서 코드를 보면 다음과 같습니다.또한 Javadoc에 따라 인증 매니저가 제공되지 않은 경우 메모리 내 설정은 폴백이 됩니다.In-memory 인증을 사용하지 않게 되어 이 클래스는 표시되지 않게 되므로 이전에 시도한 인증 매니저 삽입이 기능합니다.

@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 로거 구성을 사용자 지정합니다.보안.Authentication Manager Configuration 및 이 메시지를 삭제합니다.

스프링 부트를 사용하는 경우 보안은 제외해야 합니다.AutoConfiguration.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();
        }
    }

User Details Service를 제외합니다.이 문제를 수정하기 위한 스프링 부트 자동 설정의 AutoConfiguration.class

예:

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

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

보안을 제외했을 때 작동하지 않았습니다.@Spring Boot Application 주석을 사용한 자동 설정. 단, @Enable에서 제외했을 때는 정상적으로 동작했습니다.자동 설정:

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })

같은 문제가 발생하여 어플리케이션에 이 행을 추가하여 properties가 문제를 해결했습니다.

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

이것은 스프링의 자동 기능 중 하나이며, 액추에이터와 같은 다른 기능을 제외하는 것처럼 제외됩니다.링크를 참조할 것을 권장합니다.

액추에이터 기능(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에서 테스트 완료.풀어주다.

Spring Security를 Spring 클라우드 게이트웨이와 함께 사용하는 경우ReactiveUserDetailsServiceAutoConfiguration.class.

이것처럼.

@SpringBootApplication(exclude = ReactiveUserDetailsServiceAutoConfiguration.class)
public class SpringClientApplication {

org.springframework.boot.autoconfigure 문서를 참조하십시오.security.servlet.사용자 상세 서비스AutoConfiguration autoconfig가 정지되는 조건이 있습니다.

이 경우 커스텀 Authentication Provider를 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);
    }
}

Spring Boot 버전 > = 2.0을 사용하는 경우 구성에서 이 콩을 설정해 보십시오.

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

참고 자료: https://stackoverflow.com/a/47292134/1195507

설정을 다른 패키지로 선언하는 경우는, 다음과 같이 컴포넌트 스캔을 추가해 주세요.

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

    public class MyApplication {

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



    }

다음과 같이 설정 클래스에 @component 주석을 추가해야 할 수도 있습니다.

  @Component
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

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

.....
  1. 또한 브라우저 캐시를 클리어하고 스프링 부트 앱을 incognito 모드로 실행

webflux를 사용하는 스프링 부트 2에서는 리액티브를 정의해야 합니다.인증 매니저

속성에서 특정 클래스에 대한 로깅만 끌 수도 있습니다.

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

아래 속성을 application.properties에 추가하는 중입니다.

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

비밀번호 생성은 다음 사용자에 의해 수행됩니다.

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({AuthenticationManager.class})
@ConditionalOnBean({ObjectPostProcessor.class})
@ConditionalOnMissingBean(
    value = {AuthenticationManager.class, AuthenticationProvider.class, UserDetailsService.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 {

다음 콩(JwtDecoder, OpaqueTokenIntrospector, ClientRegistrationRepository)이 없는 경우 비밀번호 생성이 호출되었습니다.

그래서 우리의 경우도 이 문제에 직면하게 되었습니다.

@SpringBootApplication(exclude = {FlywayAutoConfiguration.class, UserDetailsServiceAutoConfiguration.class})

User Details Service 추가AutoConfiguration.class에서 제외된 경우 로그에는 비밀번호가 생성되지 않았습니다.

언급URL : https://stackoverflow.com/questions/30761253/remove-using-default-security-password-on-spring-boot

반응형