◀ 28.

【Spring】Basic認証の実装と特定のURLに限定する方法

▶

SpringのBasic認証を特定URLで使うときは、対象版と「どこを公開・認証・拒否するか」を先に決めます。新旧設定を混ぜず、対象外URLまで確認します。

publicは明示公開、testはBasic認証、未指定URLは拒否する設定の図

この記事の要点
  • Spring Boot でBasic 認証を実装する手順
  • 依存: spring-boot-starter-security を pom.xml に追加
  • 新しい設定例: SecurityFilterChain BeanとラムダDSL。従来のWebSecurityConfigurerAdapter例は旧5系の保守用として後半に保持
  • URLごとに認証・公開・拒否を明示。下の新例は/testと/test/**でBasic認証、/public/**は公開、未指定URLは拒否

 

対象バージョンとURLの保護範囲

新例はSpring Boot 3.5.6 / Spring Security 6.5.5 / Java 21で検査したServlet向け設定です。最新版すべてでの動作保証やWebFlux用の設定ではありません。依存はBootのBOMに任せ、SecurityのJARだけを別系列へ強制更新しないでください。WebSecurityConfigurerAdapterは5.7で非推奨となった旧方式です。後半の旧コードと新コードは同時に登録せず、対象版に合う一方を選びます。

「URLを限定」には、チェーン自体の対象を絞るsecurityMatcherと、チェーン内の許可条件を決めるrequestMatchersという別の意味があります。旧例のhttp.antMatcher("/test")はチェーンを/testに限定するため、別のチェーンがなければ対象外はSpring Securityで保護されません。anyRequest().authenticated()を足しても、チェーン対象外まで保護する指定にはなりません。/testだけの指定と/test/**も区別してください。

新しい設定例: 公開・Basic認証・拒否を明示する

下のクラスはsecurityMatcherを指定せず、全URLを判定対象にします。/public/**だけ認証なしで公開し、/testとその下のURLに認証を要求、それ以外は認証済みでも拒否します。既存サイトへ導入する前に必要な公開URL・API・エラー処理等を洗い出し、許可範囲を設計してください。anyRequest().permitAll()へ安易に変更すると、未指定の管理URLまで公開します。

ファイル例はsrc/main/java/example/WebSecurityBasicConfig.javaです。package exampleは自分のSpring Bootアプリのコンポーネントスキャン範囲に合わせて変更します。このクラスはURLの処理本体を作りません。実際のControllerと、既存の認証・他のSecurityFilterChainとの重複も確認してください。

package example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class WebSecurityBasicConfig {
    @Bean
    SecurityFilterChain basicSecurity(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(auth -> auth
                .requestMatchers("/public/**").permitAll()
                .requestMatchers("/test", "/test/**").authenticated()
                .anyRequest().denyAll())
            .httpBasic(Customizer.withDefaults());
        return http.build();
    }
}

認証情報は実行環境から渡す

Boot標準のユーザー自動構成を使う小規模な確認例では、application.propertiesに以下を置き、実行プロセスへBASIC_USER / BASIC_PASSWORDを設定します。実在する資格情報をGit・画面・ログへ出さないでください。UserDetailsServiceやAuthenticationProviderを独自定義している構成では、標準ユーザー設定だけで既存の認証先を置き換えられるとは限りません。

spring.security.user.name=${BASIC_USER}
spring.security.user.password=${BASIC_PASSWORD}

環境変数は秘密値の渡し方であって、ユーザーDBへ平文パスワードを保存する推奨ではありません。下に残したtest_user/test_passwordは旧コードを読むためのダミー値です。本番で使わないでください。

401と403、GETとPOSTを分けて確認する

確認条件この例の期待結果
GET /test、認証情報なし401、BasicのWWW-Authenticateヘッダー
GET /test/child、認証情報なし401。子のURLも認証対象
GET /test、正しいユーザーとパスワードControllerが存在すれば200
GET /test、誤ったパスワード401
GET /public/info、認証情報なしControllerが存在すれば200
GET /other または /testing、認証済み403。/testingは/test/**ではない
POST /test、認証済み・CSRFトークンなし403。Basic認証だけでCSRF対策は不要にならない
POST /test、認証済み・有効なCSRFトークンありControllerの処理へ進む

ブラウザー以外で確認する場合もHTTPSを使います。curlなら、管理下のテスト環境でcurl -i --user test_user https://example.com/testのようにパスワードを引数へ直接書かず対話入力できます。ただし本文後半のダミー値を本番へ設定して試す意味ではありません。401/403だけでなくWWW-Authenticate・到達したController・メソッドも確認してください。Basic認証は通信内容を暗号化しないため、HTTPSが必要です。

この例はCSRF設定を無効化していません。ブラウザーが資格情報を自動送信するBasic認証にもCSRFリスクがあります。POSTが403だからという理由だけでcsrf.disable()を足さず、利用クライアント、既存のトークン連携、認可を確認します。authenticated()はログイン済みかの判定であり、管理者だけを許可するロール検査ではありません。

掲載クラスそのものを使ったMockMvcの9テストで、正誤のBasic資格情報、公開/未指定/似たURL、POSTのCSRF有無を検査しています。実ブラウザーの認証ダイアログ、実DBのユーザー認証、実サイトのHTTPS/プロキシ設定まで検証したものではありません。

旧5系の設定を保守するとき

以下の元コードは比較・保守用にそのまま残します。今回の6.5.5でWebSecurityConfigurerAdapterを使う設定として貼り付けないでください。既存5系の正確な依存版・保守状況を確認し、旧環境そのものの起動確認とは分けて扱います。

pom.xmlに追記

この依存名は新例でも使用します。既存pomのSpring Boot parent/BOMに合わせます。下の断片だけではpom全体になりません。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>
spring-boot-starter-security</artifactId>
</dependency>

 

設定クラスを追加

旧方式の原コードです。 このantMatcher("/test")は認可条件のantMatchersではなくチェーン対象の限定です。上の新例を適用する場合は、この旧クラスを同時に登録しません。

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;

@EnableWebSecurity
public class WebSecurityBasicConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        
        http.antMatcher("/test");
//URLを限定する
        http.httpBasic();
        http.authorizeRequests().anyRequest().authenticated();
    }
}

 

 

application.propertiesに追記

spring.security.user.name=test_user

spring.security.user.password=test_password

 

公式資料

2026年10月確認: 旧AdapterからBean構成への変更、チェーンとURLマッチャー、Basic認証、CSRF保護。

子ページ

子ページはありません

同階層のページ
  1. インストール(eclipseプラグイン)
  2. クイックスタート
  3. プロジェクトの作成
  4. Spring Bootプロジェクトの作成
  5. Spring Bootプロジェクトの実行
  6. Spring BootでHello World!
  7. アノテーション一覧
  8. DB接続設定からエンティティおよびリポジトリの作成、値の取得まで(JPA編)
  9. DB接続設定や値の取得(JdbcTemplate編)
  10. ビューから値をモデルに格納しコントローラーで受け取る方法
  11. コントローラーにてモデルに値を格納してビューに渡す方法
  12. テンプレートエンジン
  13. ModelとModelAndViewの違い
  14. AOPの使用方法
  15. classpath: 内部ファイルの読み込み
  16. file: 外部ファイルの読み込み
  17. CSVファイルアップロード方法(Ajax)
  18. CSVファイルダウンロード方法(Ajax)
  19. Spring Bootプロジェクトのビルドと本番環境へのデプロイ方法(内部tomcat使用)
  20. Application.propertiesの環境依存設定の分割方法
  21. JPAにおけるEntityManagerの取得方法
  22. JPAにおけるjava.sql.Connectionの取得方法
  23. エラー一覧
  24. jarの引数を受け取る方法
  25. Spring BootでGmailからメール送信
  26. 複数のDBに接続する設定(Spring Boot & JPA編)
  27. ポート番号の変更
  28. Basic認証の実装と特定のURLに限定する方法
  29. Spring SecurityのBasic認証の無効化
  30. 独自のエラーページを定義する方法
  31. プロパティファイルの値やjar実行時の引数を取得する方法

最近更新/作成されたページ