SpringSecurity

Similar documents
WTM2019SingleSignOn

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

メディプロ1 Javaサーブレット補足資料.ppt

OSSTechドキュメント

Microsoft PowerPoint ppt

intra-mart Accel Platform — 外部ソフトウェア接続モジュール 仕様書   第3版  

スライド 1

Javaセキュアコーディングセミナー2013東京第1回 演習の解説

intra-mart WebPlatform/AppFramework

OSSTechプレゼンテーション

(Microsoft PowerPoint - \223\306\217KJAVA\221\346\202R\224\ ppt)

V8.1新規機能紹介記事

Java知識テスト問題

Java演習(4) -- 変数と型 --

はじめに インフォマート API の呼び出しには OAuth2.0 による認証を受ける必要があります OAuth2.0 を使うことで インフォマート API を利用するサービスは インフォマートプラットフォーム ID( 1 以下 PFID) とパスワードを保存したり処理したりすることなく PFID

JAVA入門

Wagby Testing Framework

PowerPoint プレゼンテーション

PowerPoint プレゼンテーション

Apache ActiveMQ における認証処理不備の脆弱性

新・明解Java入門

intra-mart im-JavaEE Framework

目的 泡立ち法を例に Comparableインターフェイスの実装 抽象クラスの利用 型パラメタの利用 比較 入替 の回数を計測

プレポスト【問題】

GUIプログラムⅣ

PowerPoint Presentation

Active Directory フェデレーションサービスとの認証連携

WebOTXマニュアル

JUnit 概要 2015/4/16 版今泉俊幸 2015 bbreak Systems 1

intra-mart im-J2EE Framework

1.SqlCtl クラスリファレンス SqlCtl クラスのリファレンスを以下に示します メソッドの実行中にエラーが発生した場合は標準エラー出力にメッセージを出力します (1)Connect() メソッド データベースへ connect 要求を行います boolean Connect(String

PowerPoint Presentation

SAML認証

PowerPoint プレゼンテーション

intra-mart Accel Platform — OData for SAP HANA セットアップガイド   初版  

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

HCI プログラミング 8 回目ボタン チェックボックス ラジオボタン 今日の講義で学ぶ内容 ボタンとアクションイベント ボタンのカスタマイズ チェックボックスとラジオボタン ボタンとアクションイベント 1 ボタンを配置してみましょう ボタンは ラベルと同じようにフォントやその色 画像の貼り付けなど

PowerPoint Presentation

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

はじめに 本ドキュメントでは Salesforce 標準機能である 変更セット を使用して Visualforce ページ Apex クラスを Sandbox から本番環境に移行する手順を説明します 但し前提条件として Sandbox 本番環境共に SkyVisualEditor がインストールされ

Microsoft Word - Android_SQLite講座_画面800×1280

更新用証明書インポートツール 操作マニュアル 2011 年 10 月 31 日 セコムトラストシステムズ株式会社 Copyright 2011 SECOM Trust Systems CO.,LTD. All rights reserved. P-1

2 Soliton SmartOn Solo Ver (USB2-NFC NFC-ST NFC-RW 対応 ) ここでは Soliton SmartOn Solo Ver のリリース概要について説明します 機能の詳細およびインストール方法については 体験版に含まれてい

1 ユーザ認証を受けた権限で アプリケーションを利用するために ログインプロキシにアクセスします 2 ログインプロキシにより Shibboleth SP から Shibboleth IdP の認証画面にリダイレクトされます 3 ブラウザに認証画面を表示します 4 認証画面にユーザ / パスワードを入

Spacewalkにおけるクロスサイトフォージェリ(CSRF)の脆弱性

第2回講義

TestDesign for Web

グラフの探索 JAVA での実装

Oracleセキュア・エンタープライズ・サーチ

ファイルを直接編集する画面を切り替えることができる. 図 3 標準のレイアウトを削除する (2) グラフィカル レイアウト画面で LinearLayout(Vertical) を追加するパレットウィンドウの レイアウト の中にある LinearLayout(Vertical) をドラッグして, 編集

Microsoft PowerPoint - OP25全ソフト設定_suruga0106.ppt

intra-mart Accel Platform — OAuth認証モジュール 仕様書   初版  

Microsoft Word - Gmail-mailsoft_ docx

--- サーバ側処理 Java servlet の例 // 通常の Java servlet での POST で受信と同じ protected void dopost(httpservletrequest request, HttpServletResponse response) throws S

Prog2_12th

プログラミング基礎I(再)

JAVA とテンプレート

クライアント証明書導入マニュアル

注意 インストール中に ユーザアカウント制御 ( 以下 UAC といいます ) の実行確認画面が表示されることがあります 表示された場合ははいをクリックして インストールを進めてください なお 管理者以外の場合 管理者への昇格を求める UAC 画面が表示される場合がありますので 管理者アカウントのパ

Microsoft Word - Gmail-mailsoft設定2016_ docx

2

IM-SecureBlocker

改版履歴 版数 日付 内容 担当 V /03/27 初版発行 STS V /01/27 動作条件のオペレーティングシステムに Windows 7 STS を追加 また 動作条件のブラウザに Internet Explorer 8 を追加 V /0

Oracle Un お問合せ : Oracle Data Integrator 11g: データ統合設定と管理 期間 ( 標準日数 ):5 コースの概要 Oracle Data Integratorは すべてのデータ統合要件 ( 大量の高パフォーマンス バッチ ローブンの統合プロセスおよ

FUJITSU Cloud Service K5 認証サービス サービス仕様書

ASP.NET 2.0 Provider Model 概要

Oracle9iAS Single Sign-On サードパーティ製品との統合

手書認識 グラフ描画 Step2-2 手書認識 : 認識結果を PaintPanel で描画する < 属性付き文字列 AttributedString> 標準出力では分かりにくいうえに認識結果を使えないので 認識するごとに PaintPanel に文字を描画することにする ここで 数式はただの文字列

基本情報STEP UP演習Java対策

ムの共有アドレス帳 インスタント メッセージングの宛先に活用することも考えられる 統合アカウント管理 認証 認可 ( アクセス制御 ) の機能 サービス機能 サービス定義統合アカウント管理利用者の認証情報 ( ユーザ ID パスワード) と属性情報 ( グループ 所属部門等 ) を一元的に管理する機

(Microsoft PowerPoint - ClickFramework.ppt [\214\335\212\267\203\202\201[\203h])

Microsoft PowerPoint - Lecture_3

Cisco CSS HTTP キープアライブと ColdFusion サーバの連携

LEAP を使用して Cisco ワイヤレス クライアントを認証するための Funk RADIUS の設定

Java 2 - Lesson01

intra-mart Accel Platform — 外部ソフトウェア接続モジュール 仕様書   第2版  

Javaの作成の前に

"CAS を利用した Single Sign On 環境の構築"

Q&A集

RADIUS サーバを使用して NT のパスワード期限切れ機能をサポートするための Cisco VPN 3000 シリーズ コンセントレータの設定

第1章 ビジュアルプログラミング入門

11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS デザインパターンとは? デザインパターン 過去のソフトウェア設計者が生み出したオブジェクト指向設計に関して, ノウハウを蓄積し 名前をつけ 再利用しやすいようにカタログ化したもの 各デ

文字列操作と正規表現

FUJITSU Cloud Service for OSS 認証サービス サービス仕様書

成功しました と表示されればライセンス認証の更新は完了です プロダクトキーを入力した後にテキストエディタが開き エラーメッセージが表示された場合 WEB ブラウザを起動して指定されたアドレスにアクセスしアカウントでログインします 画面に表示された ライセンスファイル を全てコピーし Originのダ

JavaプログラミングⅠ

HTTP 404 への対処

GEC-Java

Java プログラミング Ⅰ 3 回目変 数 今日の講義講義で学ぶ内容 変数とは 変数の使い方 キーボード入力の仕方 変 数 変 数 一時的に値を記憶させておく機能 変数は 型 ( データ型 ) と識別子をもちます 2 型 ( データ型 ) 変数に記憶する値の種類変数の型は 記憶できる値の種類と範囲

SinfonexIDaaS機能概要書

ご利用のコンピュータを設定する方法 このラボの作業を行うには 事前設定された dcloud ラボを使用するか 自身のコンピュータをセットアップします 詳細については イベントの事前準備 [ 英語 ] とラボの設定 [ 英語 ] の両方のモジュールを参照してください Python を使用した Spar

Kerberos の設定

Formal Engineering Methods for Software Development --An Introduction to SOFL--

E S E T F i l e S e c u r i t y LAN DISK H シリーズパッケージ ( 機能追加 ) ご注意 事前に本パッケージの追加をおこなってください パッケージの追加方法は 画面で見るマニュアル をご覧ください 本パッケージの追加は HDL-H シリーズファームウェアバー

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

intra-mart Accel Platform — IM-FileExchange 管理者操作ガイド   第3版  

intra-mart im-J2EE Framework

9 WEB監視

Transcription:

Spring Security 1/40

OUTLINE Spring Security Spring Securityを使った認証の仕組み Spring Securityを使った独自認証 認証エラーメッセージの変更 2/40

Spring Security 3/40

Spring Security とは アプリケーションのセキュリティを高めるためのフレームワーク 認証 認可機能 その他 多数のセキュリティ関連の機能を持つ 対応する認証機能 JDBC 認証 LDAP 認証 CAS 認証 X509 認証 Basic 認証 etc 4/40

なぜ Spring Security? メリット Spring Framework 標準の認証用プロダクト 多彩な基本機能 JDBC 認証 LDAP 認証, OAuth2 認証 基本機能なので設定のみで対応可能 カスタマイズは不要 拡張性の向上 多くのカスタマイズポイントが用意されている 5/40

Spring Security を使った認証の仕組み 6/40

セキュリティレイヤ セキュリティの向上 = セキュリティレイヤの導入 各レイヤと独立してセキュリティ機能を付加する ネットワーク : ファイアウォール DMZ 侵入検知システム OS : ファイアウォール Spring Security = セキュリティレイヤ Webアプリケーションにセキュリティレイヤを提供 Webアプリケーションの機能とは疎結合 7/40

Servlet Filter Servlet Filter とは クライアントからリクエストの前処理やサーバーからのレスポンスの後処理を追加できる機能 Tomcat(Servlet Container) request Client response Filter01 Filter02 Filter03 Servlet 8/40

Spring Security が提供するセキュリティレイヤ Spring Security = Servlet Filter すべての処理に先立ってセキュリティチェックを行う セキュリティ要件を満たさないリクエストはエラーとする Tomcat(Servlet Container) Client request response Secure check Spring Security Filter02 Filter03 Servlet 9/40

フィルタベースの実装 フィルタベースの実装 Spring Securityを有効にすると自動的にフィルタが追加 フィルタで様々な機能を実現 実際は次の順で処理が移譲されている 1. DelegatingFilterProxy 2. FilterChainProxy 3. Spring Security 用 Filter( 複数 ) 10/40

様々なフィルタ Spring Security が提供しているフィルタ ( 一部 ) SecurityContextPersistenceFilter 認証情報を管理する SecurityContext の保持を行う LogoutFilter ログアウト処理を行う UsernamePasswordAuthenticationFilter 認証処理を行う FilterSecurityInterceptor 認証結果をもとにしたアクセス権のチェックを行う フィルタは設定により追加 除去が可能 11/40

UsernamePasswordAuthenticationFilter UsernamePasswordAuthenticationFilter での認証 ユーザー名 / パスワードでの認証処理を行う 特定のURLにPOSTリクエストがくると動作する wagby の場合は logon.do 認証情報を表す Authentication インスタンスを作成 // 画面で入力された username,password を保持する Authentication の作成 Authentication authentication = new UsernamePasswordAuthenticationToken(username, password); authentication.isauthenticated(); // この時点では false 12/40

Authentication クラス Authentication クラスの役割 送信されたユーザー名とパスワードを保持する 認証状況 ( 認証済 / 未認証 ) の情報を保持する 認証後は認証ソース (LDAP や AD, JDBC テーブル ) から取得したユーザー名 / パスワード等も保持する ただしパスワードは認証処理が終わると削除され 長期保持はされない Authentication のサブクラス AnonymousAuthenticationToken, UsernamePasswordAuthenticationToken, RunAsUserToken 認証処理は AuthenticationManager へ移譲する 13/40

処理の流れ (AuthenticationFilter) UsernamePasswordAuthenticationFilter 認証 Token(Authentication インスタンス ) を作成 Client logon.do username/password UsernamePassword AuthenticationFilter username password AuthenticationManager Authentication 14/40

AuthenticationManager AuthenticationManager/AuthenticationProvider AuthenticationManager は複数の AuthenticationProvider を保持 実際の認証処理は AuthenticationProvider へ更に移譲 いずれか一つの AuthenticationProvider で認証が成功すれば認証済みとなる AuthenticationProvider の主なサブクラス DaoAuthenticationProvider LdapAuthenticationProvider ActiveDirectoryLdapAuthenticationProvider 15/40

処理の流れ (AuthenticationManager) AuthenticationManager AuthenticationManager は AuthenticationProvider へ処理を委譲 UsernamePassword AuthenticationFilter AuthenticationManager AuthenticationProvider AuthenticationProvider AuthenticationProvider AuthenticationProvider username password Authentication 16/40

AuthenticationProvider AuthenticationProvider 認証処理を実行するクラス 定義されているメソッドは 2 つ authenticate() メソッド : 認証処理を実装するメソッド supports() メソッド : この認証プロバイダがサポートする Authentication クラスの指定 通常は UsernamePasswordAuthenticationToken @Override public boolean supports(class<?> authentication) { // POST で送信されたユーザー名とパスワードで認証を行う return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); } 17/40

authenticate() メソッド 認証処理を行うメソッド 認証エラーの場合は AuthenticationException を throw 認証成功時の処理 認証ソース (LDAP や AD, JDBC テーブル ) から取得したユーザー名とパスワードから UserDetails インスタンスを作成 認証情報を表す Authentication インスタンスに UserDetails をセットする Authentication に UserDetails がセットされていれば認証が成功したものと判断する 18/40

認証成功時の実装 // username, password は認証ソースから取得したもの // 権限は ROLE_USER 固定 (Wagby では利用されない ) UserDetails user = new User(username, password, AuthorityUtils.createAuthorityList("ROLE_USER")); // 認証情報に UserDetails オブジェクトを格納 UsernamePasswordAuthenticationToken authenticationresult = new UsernamePasswordAuthenticationToken(user, authentication.getcredentials(), user.getauthorities()); authenticationresult.setdetails(authentication.getdetails()); authentication.isauthenticated(); // この時点では true 19/40

処理の流れ (AuthenticationProvider) AuthenticationProvider 認証処理に成功すると認証 Token に UserDetails オブジェクトがセットされる AuthenticationManager AuthenticationProvider AuthenticationProvider AuthenticationProvider AuthenticationProvider username password UserDetails FilterSecurityInterceptor Authentication 20/40

認証後の認証情報の取得 認証情報は SecurityContextHolder が保持 Spring Security 処理後は認証情報は SecurityContextHolder を介して取得する Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); authentication.isauthenticated(); // 認証状況を確認できる UserDetails username password Authentication SecurityContextHolder 21/40

各クラスの役割 クラス UsernamePasswordAuthenticationFilter Authentication (UsernamePasswordAuthenticationToken) AuthenticationManager AuthenticationProvider UserDetails 役割 認証処理の入口となるクラス Authentication を作成する 認証情報を保持するクラス ( 認証済 / 未認証 ) AuthenticationProvider に実際の認証処理を委譲するクラス 認証処理を実行するクラス 認証成功を意味するクラス 認証ソースから取得したユーザ情報を保持する 22/40

処理の流れ ( 全体 ) 1. ログオン画面でユーザー名とパスワードを入力し ログオン 2. ブラウザから logon.do に POST リクエストを送信 3. UsernamePasswordAuthenticationFilter でユーザー名とパスワードを保持した UsernamePasswordAuthenticationToken を作成 ( この時点では未認証 ) 4. 認証処理は AuthenticationManager へ移譲される 5. AuthenticationManager は更に複数の AuthenticationProvider へ処理を委譲 6. 複数の AuthenticationProvider のうち UsernamePasswordAuthenticationToken の認証をサポートするクラスのみが認証処理を行う 23/40

処理の流れ (2) 7. JDBC 認証用 AuthenticationProvider であればデータベースからユーザー名とパスワードを取得し ログオン画面で入力されていたものと一致していれば認証成功とする 8. 認証成功の場合は UserDetails オブジェクトを作成し Authentication( 認証情報 ) に格納する 9. 認証失敗の場合は AuthenticationException を throw する 24/40

Spring Security を使った独自認証 25/40

独自認証処理を行う 1. ログオン画面でユーザー名とパスワードを入力し 7. JDBC 認証用 AuthenticationProvider であればデータベースからユーザー名とパスワードを取得し ログオン画面で入力されていたものと一致していれば認証成功とする 7. カスタマイズした AuthenticatonProvider で独自認証を行う 8. 認証成功の場合は UserDetails オブジェクトを作成し Authentication( 認証情報 ) に格納する 9. 認証失敗の場合は AuthenticationException を throw する AuthenticationProvier をひとつ作成するだけで実現可能 26/40

独自認証用 AuthenticationProvider public class SampleAuthenticationProvider implements AuthenticationProvider { /** {@inheritdoc} **/ @Override public Authentication authenticate(authentication authentication) throws AuthenticationException { // ここに独自認証ロジックを記述する } } /** {@inheritdoc} **/ @Override public boolean supports(class<?> authentication) { // POST で送信されたユーザー名とパスワードで認証を行う return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); } 27/40

独自認証処理 ( 例 ) 画面で入力されたユーザー名パスワードを取得 authentication から取得できる public Authentication authenticate(authentication authentication) throws AuthenticationException { authentication.isauthenticated(); // この時点では false; // 入力されたユーザー名とパスワードを取得 String username = authentication.getname(); String password = authentication.getcredentials().tostring(); 28/40

独自認証ロジック 独自認証処理 ( 例 ) ユーザー名 パスワードのいずれかが未入力の場合は認証エラー (AuthenticationCredentialsNotFoundException) パスワードが secret であれば認証成功 その他の文字は認証エラー (UsernameNotFoundException) if (StringUtils.isBlank(username) StringUtils.isBlank(password)) { // ユーザー名 / パスワードのいずれかが未入力の場合 throw new AuthenticationCredentialsNotFoundException( "User is not Authenticated"); } if (!"secret".equals(password.trim())) { // パスワードが "secret" ではない場合 throw new UsernameNotFoundException( "Username " + username + " not found"); } 29/40

認証成功時の処理 独自認証処理 ( 例 ) 認証済であることを示す UserDetails オブジェクトを作成 ユーザー名 パスワードは認証ソースから取得したものをセット 権限は ROLE_USER 固定 (Wagby では利用されない ) 認証情報 (Authentication) に UserDetails をセットする 厳密には元の Authentication をベースに再作成 UserDetails user = new User(username.trim(), password.trim(), AuthorityUtils.createAuthorityList("ROLE_USER")); // 認証情報に UserDetails オブジェクトを格納 UsernamePasswordAuthenticationToken authenticationresult = new UsernamePasswordAuthenticationToken(user, authentication.getcredentials(), user.getauthorities()); authenticationresult.setdetails(authentication.getdetails()); authenticationresult.isauthenticated(); // この時点では true return authenticationresult; 30/40

独自認証用 AuthenticationProvider を設定する SecurityConfiguration Wagby 標準の Spring Security の設定用クラス Spring Security が提供している WebSecurityConfigurerAdapter を継承 JDBC 認証 (juser テーブル ),LDAP 認証 ActiveDirectory 認証に対応 application.properties に設定を行うだけで利用可能 31/40

独自認証用 AuthenticationProvider を設定する (2) SecurityConfiguration の拡張クラスを作成 パッケージ名 :jp.jasminesoft.wagby.autoconfiguration リポジトリで定義したパッケージ名 +.autoconfiguration jp.jasminesoft.jfc.autoconfiguration.securityconfiguration を継承する @Configuration アノテーションを付与する クラス名 : 任意 上記の条件を満たした SecurityConfiguration の拡張クラスを用意すると自動的に Wagby 標準クラスは無効化される configure(authenticationmanagerbuilder) メソッドをオーバーライドし独自認証用の AuthenticationProvider を追加 32/40

独自認証用 AuthenticationProvider を設定する (3) package jp.jasminesoft.wagby.autoconfiguration; import... @Configuration public class MySecurityConfiguration extends SecurityConfiguration { } /** {@inheritdoc} **/ @Override protected void configure(authenticationmanagerbuilder auth) throws Exception { auth.authenticationprovider(new SampleAuthenticationProvider()); super.configure(auth); // Wagby の JDBC 認証を併用しない場合は不要 } 33/40

認証エラーメッセージの変更 34/40

認証エラーメッセージを変更する 認証時のエラーの種類は AuthenticationException のサブクラスで表現 AuthenticationException のサブクラス ( 一部 ) AccountExpiredException LockedException UsernameNotFoundException BadCredentialsException Spring Security では認証エラー時の処理は AuthenticationFailureHandler で実装する AuthenticationFailureHandler で AuthenticationException を取得し 種類に応じたエラーメッセージをセットする 35/40

AuthenticationFailureHandler の拡張クラス MultipleSessionAuthenticationFailureHandler マルチセッション用に AuthenticationFailureHandler を拡張したクラス (Wagby 側で用意したクラス ) 独自のエラーメッセージを表示するには MultipleSessionAuthenticationFailureHandler の saveerrormessage() メソッドを拡張する 作成した拡張クラスを Spring の Bean として登録する 36/40

拡張 AuthenticationFailureHandler package jp.jasminesoft.wagby; import... /** * カスタマイズ用認証失敗時のハンドラです */ public class SampleAuthenticationFailureHandler extends MultipleSessionAuthenticationFailureHandler { /** * コンストラクタ * @param defaultfailureurl 認証失敗時の遷移先 */ public SampleAuthenticationFailureHandler(String defaultfailureurl) { super(defaultfailureurl); } /** {@inheritdoc} */ @Override public void saveerrormessage(httpservletrequest request, HttpServletResponse response, AuthenticationException exception) { // ここでエラーメッセージをセットする } } 37/40

saveerrormessage() メソッド実装例 /** {@inheritdoc} */ @Override public void saveerrormessage(httpservletrequest request, HttpServletResponse response, AuthenticationException exception) { super.saveerrormessage(request, response, exception); } Jfcerror jfcerror = new Jfcerror(); if (exception instanceof LockedException) { jfcerror.setcontent(" アカウントがロックされています "); } else if (exception instanceof AccountExpiredException) { jfcerror.setcontent(" アカウントの有効期限が切れています "); } else { // 何もせずデフォルトのエラーメッセージを表示させる return; } // エラーメッセージを格納している JfcErrors を取得 Jfcerrors errors = (Jfcerrors) request.getsession(true).getattribute( BaseController.JfcerrorsRequestName); // すでにセットされているエラーメッセージを表示させない場合はerrors をクリアする errors.clearjfcerror(); // 作成したエラーメッセージを追加する errors.addjfcerror(jfcerror); 38/40

AuthenticationFailureHandler 拡張クラスの登録 次のコードを SecurityConfiguration の拡張クラスに実装することで登録できる 以下のメソッドを MySecurityConfiguration に追加 これにより従来 Wagby が利用していた MultipleSessionAuthenticationFailureHandler が無効化され SampleAuthenticationFailureHandler が利用される /** * AuthenticationFailureHandler の bean 定義 * @return AuthenticationFailureHandler */ @Bean protected AuthenticationFailureHandler authenticationfailurehandler() { return new SampleAuthenticationFailureHandler( securityproperties.getlogonpage() + "?error"); } 39/40

まとめ 独自認証処理を行う 1. 独自認証用 AuthenticationProvider を作成 authenticate() メソッドに認証処理を実装 2. SecurityConfiguration の拡張クラスを作成 独自認証用 AuthenticationProvider を設定 エラーメッセージの変更 1. MultipleSessionAuthenticationFailureHandler のサブクラスを作成 saveerrormessage() メソッドにてエラーメッセージを登録 2. SecurityConfiguration の拡張クラスを作成 ( すでに存在する場合は不要 ) MultipleSessionAuthenticationFailureHandler のサブクラスを Bean 登録 40/40