カテゴリ: Spring 更新日: 2025/12/15
PR
独学でJavaを学んでいる方向け
「実務レベルに到達できるか不安」「1人だと詰まることが多い」場合は、 実践重視で学べる環境を一度確認しておくのも一つの手です。
EBAエデュケーション |学習内容・サポートを見る

Spring Securityで認証失敗や権限不足の例外をハンドリングする方法を徹底解説

例外ハンドリング:認証失敗/権限不足をハンドラーで制御する
例外ハンドリング:認証失敗/権限不足をハンドラーで制御する

先生と生徒の会話形式で理解しよう

生徒

「Spring Securityでログインに失敗したときって、どうやってエラーメッセージを表示したり、リダイレクトを制御するんですか?」

先生

「それはAuthenticationFailureHandlerを使って処理をカスタマイズすることでできますよ。また、ログイン済みでもアクセス権限がない場合にはAccessDeniedHandlerを使います。」

生徒

「じゃあ、自分でそのハンドラーを作成して登録すれば、好きなように制御できるんですね!」

先生

「その通りです。これから実際の使い方を順番に見ていきましょう!」

1. Spring Securityの例外ハンドリングとは?

1. Spring Securityの例外ハンドリングとは?
1. Spring Securityの例外ハンドリングとは?

Spring Securityはデフォルトでログイン失敗時やアクセス拒否時に自動的なエラーページへ遷移させますが、これを自分で制御したい場合は、専用のハンドラークラスを作成して設定します。

具体的には以下の2つを使います。

  • AuthenticationFailureHandler:認証失敗時(ログイン失敗)を制御
  • AccessDeniedHandler:権限不足時(403エラー)を制御

それぞれを独自に実装して、Spring Securityの設定に組み込むことで、認証処理の流れを柔軟にカスタマイズできます。

2. 認証失敗時を制御するAuthenticationFailureHandlerの実装方法

2. 認証失敗時を制御するAuthenticationFailureHandlerの実装方法
2. 認証失敗時を制御するAuthenticationFailureHandlerの実装方法

ログインフォームでパスワードを間違えたなど、認証に失敗したときの処理をカスタマイズするにはAuthenticationFailureHandlerを実装します。

以下にその例を示します。


@Component
public class CustomAuthFailureHandler implements AuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest request,
                                        HttpServletResponse response,
                                        AuthenticationException exception)
                                        throws IOException, ServletException {
        response.sendRedirect("/login?error=true");
    }
}

このように、ログイン失敗時に指定のURL(ここでは/login?error=true)へリダイレクトするように設定できます。

PR

将来を見据えて、+αのスキルを身につけたい方へ

JavaやLinuxを学んでいても、「このままで市場価値は上がるのか」 「キャリアの選択肢を広げたい」と感じる方は少なくありません。

AIを学ぶならアイデミープレミアム

3. 権限不足時のエラー制御:AccessDeniedHandlerの使い方

3. 権限不足時のエラー制御:AccessDeniedHandlerの使い方
3. 権限不足時のエラー制御:AccessDeniedHandlerの使い方

ログインは成功しているが、アクセス先に対する権限が足りない場合はAccessDeniedHandlerを使います。


@Component
public class CustomAccessDeniedHandler implements AccessDeniedHandler {
    @Override
    public void handle(HttpServletRequest request,
                       HttpServletResponse response,
                       AccessDeniedException accessDeniedException)
                       throws IOException, ServletException {
        response.sendRedirect("/access-denied");
    }
}

このようにして、403エラー画面の代わりに独自のエラーページへ誘導することができます。

4. Spring Securityへのハンドラー登録方法

4. Spring Securityへのハンドラー登録方法
4. Spring Securityへのハンドラー登録方法

上記で作成したAuthenticationFailureHandlerAccessDeniedHandlerを、Spring Securityの設定クラス内で登録します。


@Configuration
@EnableWebSecurity
public class SecurityConfig {
    
    @Autowired
    private CustomAuthFailureHandler customAuthFailureHandler;

    @Autowired
    private CustomAccessDeniedHandler customAccessDeniedHandler;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .formLogin(form -> form
                .loginPage("/login")
                .failureHandler(customAuthFailureHandler)
            )
            .exceptionHandling(ex -> ex
                .accessDeniedHandler(customAccessDeniedHandler)
            );

        return http.build();
    }
}

これで、ログイン失敗時にはCustomAuthFailureHandlerが、権限不足時にはCustomAccessDeniedHandlerが呼ばれるようになります。

5. 認証エラー情報をログイン画面に表示する

5. 認証エラー情報をログイン画面に表示する
5. 認証エラー情報をログイン画面に表示する

エラー時に/login?error=trueのようにクエリパラメータを付けてリダイレクトすることで、ログイン画面にエラーメッセージを表示できます。


<form method="post" action="/login">
    <input type="text" name="username" />
    <input type="password" name="password" />
    <button type="submit">ログイン</button>
    <div th:if="${param.error}">
        <span class="text-danger">ユーザー名またはパスワードが違います。</span>
    </div>
</form>

このようにして、ユーザーにわかりやすくエラーを通知できます。

6. よくある失敗例とその対処法

6. よくある失敗例とその対処法
6. よくある失敗例とその対処法

ハンドラーが呼ばれないというトラブルもあります。次のような原因が考えられます。

  • SecurityFilterChainにハンドラーの登録を忘れている
  • カスタムハンドラーに@Componentがついていない
  • URLマッピングが誤っていて正しいパスに遷移できない

これらはエラーログやデバッグで確認しながら1つずつ潰していくのがポイントです。

7. 認証成功時も制御したい場合は?

7. 認証成功時も制御したい場合は?
7. 認証成功時も制御したい場合は?

AuthenticationSuccessHandlerを使うことで、ログイン成功後の処理も自由に制御できます。


@Component
public class CustomAuthSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
                                        HttpServletResponse response,
                                        Authentication authentication)
                                        throws IOException, ServletException {
        response.sendRedirect("/dashboard");
    }
}

これでログイン成功後に/dashboardへ遷移するようになります。

8. 403ページをデザインする方法

8. 403ページをデザインする方法
8. 403ページをデザインする方法

/access-deniedにリダイレクトされたときに表示するページを自分で作るには、HTMLを用意してそこに説明やデザインを加えます。


<!DOCTYPE html>
<html>
<head>
    <title>アクセス拒否</title>
</head>
<body>
    <h1>アクセスが拒否されました</h1>
    <p>このページにアクセスする権限がありません。</p>
    <a href="/">トップページへ戻る</a>
</body>
</html>

まとめ

まとめ
まとめ

Spring Securityにおける例外ハンドリングの全体像

本記事では、Spring Securityを利用したWebアプリケーション開発において重要となる、 認証失敗や権限不足といった例外をどのようにハンドリングするかについて詳しく解説してきました。 Spring Securityはデフォルトでも一定の動作を提供してくれますが、 実務レベルではユーザー体験やセキュリティ要件に合わせて、 ログイン失敗時やアクセス拒否時の挙動を細かく制御する必要があります。 その際に中心となるのが、AuthenticationFailureHandlerやAccessDeniedHandlerといった 専用のハンドラーインターフェースです。

AuthenticationFailureHandlerは、ユーザー名やパスワードの誤りなど、 認証そのものが失敗した場合に呼び出されます。 これを使うことで、ログイン画面へのリダイレクト先を変更したり、 クエリパラメータを付与してエラーメッセージを表示したりといった柔軟な制御が可能になります。 一方で、AccessDeniedHandlerはログイン済みであるにもかかわらず、 権限不足によってアクセスが拒否された場合に利用されます。 両者の役割を正しく理解することが、Spring Securityの例外ハンドリングを使いこなす第一歩です。

設定クラスとハンドラー登録の重要性

カスタムハンドラーを作成しただけでは、Spring Securityの動作は変わりません。 SecurityFilterChainの設定クラス内で、formLoginやexceptionHandlingに対して 明示的にハンドラーを登録する必要があります。 この設定を忘れてしまうと、「クラスは作ったのに処理が呼ばれない」 という状況に陥りがちです。 また、@Componentアノテーションの付け忘れや、 URLパスの指定ミスもよくある原因として挙げられます。 例外ハンドリングが正しく動作しない場合は、 設定クラスとハンドラーの紐付けを最初に確認する癖をつけましょう。

まとめとしてのサンプル構成イメージ

最後に、認証失敗と権限不足の両方を意識した、 Spring Security設定のシンプルなイメージを整理しておきます。 実際の開発では、この構成をベースに画面遷移やメッセージ表示を調整していくと、 見通しの良いセキュリティ設計が可能になります。


@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Autowired
    private CustomAuthFailureHandler customAuthFailureHandler;

    @Autowired
    private CustomAccessDeniedHandler customAccessDeniedHandler;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .formLogin(form -> form
                .loginPage("/login")
                .failureHandler(customAuthFailureHandler)
            )
            .exceptionHandling(ex -> ex
                .accessDeniedHandler(customAccessDeniedHandler)
            );
        return http.build();
    }
}

このように、認証失敗と権限不足を明確に分けてハンドリングすることで、 ユーザーにとって分かりやすく、管理者にとっても保守しやすい構成になります。 Spring Securityは最初こそ設定項目が多く感じられますが、 仕組みを理解してしまえば、セキュアで柔軟な認証基盤を構築できる強力なフレームワークです。

先生と生徒の振り返り会話

生徒

「認証失敗と権限不足で、使うハンドラーが違う理由がよく分かりました。 なんとなくエラー処理をしていた頃より、頭の中が整理できた気がします。」

先生

「それは良いですね。Spring Securityでは、 どの段階でエラーが起きているのかを意識することがとても大切です。 認証なのか、認可なのかを切り分けられるようになると、 設定の理解も一気に深まります。」

生徒

「ハンドラーを登録し忘れると動かない、という点も印象に残りました。 設定クラスの確認を最初にするようにします。」

先生

「その意識はとても大事ですよ。 セキュリティ設定は小さなミスが大きな挙動の違いにつながります。 一つ一つの設定の意味を理解しながら進めていきましょう。」

生徒

「これでログインエラーや権限エラーを、 自信を持ってカスタマイズできそうです。」

先生

「その調子です。 今回学んだ内容は、実務でも頻繁に使う重要なポイントなので、 ぜひ自分のプロジェクトで試してみてください。」

Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。

Spring Framework超入門をAmazonで見る

※ Amazonアソシエイト・プログラムを利用しています

カテゴリの一覧へ
新着記事
PR

JavaやLinuxの検証環境に
低コストで使えるVPS

Thymeleafのth:blockの使い方を完全ガイド!初心者でもわかるテンプレートブロック管理
Thymeleafのth:selected属性の使い方を完全解説!初心者でもわかるセレクトボックス選択状態の指定方法
Spring MVCのルーティング設計をマスター!初心者向け@GetMappingと@PostMappingの基本と命名ルール
JSPのコメントタグとHTMLコメントの違いを徹底解説!初心者向けわかりやすい使い分け講座
PR 未経験からITエンジニアを目指す方へ

Javaを学んでいるけど、「このまま未経験で就職できるか不安」という20代向け。 学歴不問・無料サポートの就職支援という選択肢があります。

Tamesy |無料で面談予約
人気記事
No.1
Java&Spring記事人気No1
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.2
Java&Spring記事人気No2
JavaのArrayListクラスとgetメソッドを完全解説!初心者でもわかるリストの要素取得
No.3
Java&Spring記事人気No3
JavaのIntegerクラスparseIntメソッド完全ガイド!初心者でもわかる文字列から数値変換
No.4
Java&Spring記事人気No4
Spring BootのJakarta移行ガイド!初心者向けjavax→jakarta変更ポイント徹底解説
No.5
Java&Spring記事人気No5
Thymeleafのth:classappend属性の使い方を完全ガイド!初心者でもわかる動的クラス追加
No.6
Java&Spring記事人気No6
JavaのIntegerクラスの使い方を完全ガイド!初心者でもわかる整数操作
No.7
Java&Spring記事人気No7
JavaのHttpSessionを徹底解説!初心者でもわかるセッション管理の基本
No.8
Java&Spring記事人気No8
Springの@Componentアノテーションの使い方を徹底解説!初心者でもわかるSpring Boot入門
PR

ローカルPCに依存しない開発環境という選択肢

Java・Linuxの検証や学習環境を、クラウド上ですぐに用意できます。

Java入門

Javaの基礎を体系的に学びたい場合は、文法だけでなく 「なぜそう書くのか」まで丁寧に解説されているため、 初心者でも理解しやすい定番の1冊です。

スッキリわかるJava入門 第4版

※ 紙の書籍・電子書籍どちらでも購入できます

Java実践

ジェネリクス、enum、シールクラスなどの型設計から、 関数型プログラミング(ラムダ式・Stream API)、 JVM制御やリフレクション、外部ライブラリの活用までを扱っており、 「Javaを使えるレベル」へ進むための内容が網羅されています。

スッキリわかるJava入門 実践編 第4版

※ 紙の書籍・電子書籍どちらでも購入できます

Spring入門

Spring Frameworkの全体像から、 Webアプリ開発で必要となる主要機能までを 体系的に解説している定番の入門書です。

Spring徹底入門 第2版 Spring FrameworkによるJavaアプリケーション開発

※ 紙の書籍・電子書籍どちらでも購入できます

PR 実務経験のあるエンジニア向け

Javaなどの実務経験があり、次のキャリアを検討している方向け。 IT・ゲーム業界に特化した転職支援サービスという選択肢もあります。

転職ボックス |IT・ゲーム業界専門