LoginSignup
0
0

【SpringBoot】 SpringSecurityでh2コンソール画面を表示させる

Last updated at Posted at 2023-06-10

はじめに

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0