<目次>
(1) Tomcatのフォーム認証が失敗した際のトラブルシューティングメモ
(1-1) 事象①:正しいID/パスワードを入れてもログインエラーになる
(1-1-1) 発生状況・エラーメッセージ
(1-1-2) 原因・対策
(1-2) 事象②:ログインボタンを2回押さないとログイン不可
(1-2-1) 発生状況・エラーメッセージ
(1-2-2) 原因
(1-2-3) 対策
(1) Tomcatのフォーム認証が失敗した際のトラブルシューティングメモ
Tomcatのフォーム認証が意図した動作をしない場合のいくつかのパターンや解決策をご紹介いたします。
(1-1) 事象①:正しいID/パスワードを入れてもログインエラーになる
(1-1-1) 発生状況・エラーメッセージ
正しいID/パスワードを入れているにも関わらず、何故かログインエラー画面に遷移してしまうという事象です。今回のケースでは認証データの保持方式は「MemoryRealm」方式、つまり「tomcat-users.xml」のXMLにて保持しており、ログインエラー画面(jsp)には遷移しているため、HTTPエラーやサーバエラーは出ていない状況でした。
(表)
■認証データ保持方式 | MemoryRealm |
■エラーメッセージ | なし (HTTPエラーやサーバエラーはない) |
(1-1-2) 原因・対策
私のケースでは設定ファイル(server.xml)のUserDatabaseRealmの認証に必要な記述を誤ってコメントアウトしてしまっていたのが原因でした。
具体的にはserver.xmlの下記の2カ所で、いずれもRealm(TomcatにおいてユーザID、パスワード、ロール等を保持するデータベースの意)の方式の1つである「UserDatabaseRealm」、つまりTomcatのデフォルトである「tomcat-users.xml」にユーザ情報やロール情報を追記して認証する方式に必要な記述であり、コメントアウトすると動作しなくなるものです。
①<Resouce>タグ
ユーザ認証の情報を保持するファイルとして「tomcat-users.xml」を指定しています。
<Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>
↓下記がコメントインされているか?をチェック
②<Realm>タグ
UserDatabaseRealm(JNDIのリソース)に保持したユーザ情報を使って認証する設定です。
<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" />
なので、もしこれらがコメントアウトされていた場合、コメントインする事で認証が正しく動作する可能性があります。
(図112)server.xmlのRealmタグ
↓下記がコメントインされているか?をチェック
(1-2) 事象②:ログインボタンを2回押さないとログイン不可
こちらはエラーというよりは、当時の私の理解不足ですが、一応備忘として記録します。
(1-2-1) 発生状況・エラーメッセージ
フォーム認証の本来の使い方とは異なっていますが、ログイン画面(例:Login.jsp)を直接呼んだ場合に、以下のような挙動をしました。
(1-2-2) 原因
直接ログイン画面(Login.jsp)を要求してしまっていたため、このような挙動になっていました。
(図122)- A
(図122)
では、なぜログイン画面を開くと再びログイン画面に遷移してしまったのか?の原因は今回は認証範囲、つまりweb.xmlの<url-pattern>が「/*」と設定していたため、ログイン画面自体も認証の範囲となってしまっていました。
(図123)
(1-2-3) 対策
(図124)
(1-3) DataSourceRealm系のエラー
DataSourceRealmに関するエラーについては下記の記事でもご紹介していますので、併せてご参照頂けたらと思います。