SpringのBasic認証を特定URLで使うときは、対象版と「どこを公開・認証・拒否するか」を先に決めます。新旧設定を混ぜず、対象外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> |
設定クラスを追加
旧方式の原コードです。 このantMatcher("/test")は認可条件のantMatchersではなくチェーン対象の限定です。上の新例を適用する場合は、この旧クラスを同時に登録しません。
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity; @EnableWebSecurity |
application.propertiesに追記
|
spring.security.user.name=test_user spring.security.user.password=test_password |
公式資料
2026年10月確認: 旧AdapterからBean構成への変更、チェーンとURLマッチャー、Basic認証、CSRF保護。
子ページはありません
- インストール(eclipseプラグイン)
- クイックスタート
- プロジェクトの作成
- Spring Bootプロジェクトの作成
- Spring Bootプロジェクトの実行
- Spring BootでHello World!
- アノテーション一覧
- DB接続設定からエンティティおよびリポジトリの作成、値の取得まで(JPA編)
- DB接続設定や値の取得(JdbcTemplate編)
- ビューから値をモデルに格納しコントローラーで受け取る方法
- コントローラーにてモデルに値を格納してビューに渡す方法
- テンプレートエンジン
- ModelとModelAndViewの違い
- AOPの使用方法
- classpath: 内部ファイルの読み込み
- file: 外部ファイルの読み込み
- CSVファイルアップロード方法(Ajax)
- CSVファイルダウンロード方法(Ajax)
- Spring Bootプロジェクトのビルドと本番環境へのデプロイ方法(内部tomcat使用)
- Application.propertiesの環境依存設定の分割方法
- JPAにおけるEntityManagerの取得方法
- JPAにおけるjava.sql.Connectionの取得方法
- エラー一覧
- jarの引数を受け取る方法
- Spring BootでGmailからメール送信
- 複数のDBに接続する設定(Spring Boot & JPA編)
- ポート番号の変更
- Basic認証の実装と特定のURLに限定する方法
- Spring SecurityのBasic認証の無効化
- 独自のエラーページを定義する方法
- プロパティファイルの値やjar実行時の引数を取得する方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09