Spring Bootのアプリケーションにカスタムセキュリティ設定を1つ追加しましたが、「デフォルトのセキュリティパスワードを使用しています」というメッセージが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();
}
}
SecurityAutoConfigurationクラスの除外に関する解決策を見つけました。
例:
@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の 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();
}
}
Spring Boot 2.0.4を使用して、同じ問題に遭遇しました。
SecurityAutoConfiguration.class
を除外すると、アプリケーションが破壊されました。
今、私は@SpringBootApplication(exclude= {UserDetailsServiceAutoConfiguration.class})
を使用しています
@EnableResourceServer
およびJWT :)
で正常に動作します
ルックアップ: 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のロガー設定をカスタマイズし、このメッセージを削除します。
@SpringBootApplicationアノテーションを使用してSecurityAutoConfigurationを除外すると機能しませんでしたが、@ EnableAutoConfigurationで除外すると機能しました。
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
リアクティブスタック(Spring Webflux、Netty)の場合、ReactiveUserDetailsServiceAutoConfiguration.classを除外する必要があります。
@SpringBootApplication(exclude = {ReactiveUserDetailsServiceAutoConfiguration.class})
または、ReactiveAuthenticationManager Beanを定義します(異なる実装があります。ここにJWTの1つの例があります)
@Bean
public ReactiveJwtDecoder jwtDecoder() {
return new NimbusReactiveJwtDecoder(keySourceUrl);
}
@Bean
public ReactiveAuthenticationManager authenticationManager() {
return new JwtReactiveAuthenticationManager(jwtDecoder());
}
別のパッケージで構成を宣言する場合は、次のようにコンポーネントスキャンを追加してください。
@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()
.....
Webfluxを使用したSpring Boot 2では、ReactiveAuthenticationManagerを定義する必要があります
プロパティ内の特定のクラスのログをオフにすることもできます。
logging.level.org.springframework.boot.autoconfigure.security.AuthenticationManagerConfiguration=WARN
以下の行を使用してください:
spring.security.user.name=XXX
spring.security.user.password=XXX
springアプリケーションのコンテキスト内でapplication.properties
(名前は異なる場合があります)でデフォルトのセキュリティユーザー名とパスワードを設定します。
(SpringBootの自動構成の一部として)デフォルトの構成をまったく回避するには、前述のAnswersで説明したアプローチを使用します。
@SpringBootApplication(exclude = {SecurityAutoConfiguration.class })
または
@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfigurationのドキュメントを確認してください。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);
}
}
スプリングブートを使用する場合、アプリケーションクラスと、以下のようにセキュリティを正確に設定している場所の両方で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();
}
}
Spring Bootバージョン> = 2.0を使用している場合は、構成にこのBeanを設定してみてください。
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http.authorizeExchange().anyExchange().permitAll();
return http.build();
}