はじめに
SpringBootの学習中にh2コンソールを使用してデータベースの扱いをしようとしたところ、コンソール画面がSpringSecurityによって閲覧できない状態のため、やり方を調べました。
今回はその証跡として、投稿します。
■詳細
SecurityFilterChainを使用し、("/","/home","h2-console")以外のページについては認証を求めるよう記述したが、[http://localhost:8080/h2-console]にアクセスしたところ、認証を求められた。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/", "/home","/h2-console").permitAll()
.anyRequest().authenticated())
.formLogin((form) -> form
.loginPage("/login")
.permitAll())
.logout((logout) -> logout.permitAll());
return http.build();
}
■解決のために使用したサイト
SpringBoot公式ドキュメント
https://spring.pleiades.io/
参考ページ(1.5.2. 安全なアプリケーションでの H2 コンソールへのアクセス)
https://spring.pleiades.io/spring-boot/docs/current/reference/html/data.html#data.sql.h2-web-console
■なぜできなかったのか 公式ドキュメントより抜粋
H2Consoleはフレームを使用し、開発のみを目的としているため、CSRF保護対策を実装していません。
アプリケーションでSpring Securityを使用する場合は、次のように構成する必要があります。
①コンソールに対するリクエストの CSRF 保護を無効にします。
②コンソールからのレスポンスでヘッダー「X-Frame-Options」を「SAMEORIGIN」に設定します。
公式ドキュメントになぞり下記のようにコードを修正。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.securityMatcher("/h2-console/")
.csrf((csrf) -> csrf.disable())
.headers((headers) -> headers.frameOptions((frame) -> frame.sameOrigin()))
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/", "/home").permitAll()
.anyRequest().authenticated())
.formLogin((form) -> form
.loginPage("/login")
.permitAll())
.logout((logout) -> logout.permitAll());
return http.build();
}