Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Tomcat

Tomcatのフォーム認証が失敗した際のトラブルシューティングメモ

投稿日:2021年5月2日 更新日:

<目次>

(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"/>
 
(図111)server.xmlのResouceタグ
↓下記がコメントインされているか?をチェック

②<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.Login.jspを要求
2.Login.jspに遷移するので、認証情報を入力
3.要求したLogin.jspに遷移する
4.再度認証情報を入力
5.404エラー
 
(図121)
 

目次にもどる

(1-2-2) 原因

直接ログイン画面(Login.jsp)を要求してしまっていたため、このような挙動になっていました。

そもそもフォーム認証の基本的な流れとして「[①要求ページ]→[②認証画面]→(認証成功)→[③要求ページ]」のような流れを辿ります。

(図122)- A

 
なので、もし[①要求ページ]としてログイン画面自体(Login.jsp)を要求した場合はログインしたのに、再びログイン画面が出てきたように見えてしまいます・・。

(図122)

では、なぜログイン画面を開くと再びログイン画面に遷移してしまったのか?の原因は今回は認証範囲、つまりweb.xmlの<url-pattern>が「/*」と設定していたため、ログイン画面自体も認証の範囲となってしまっていました。

(図123)

 
2回目のログインに関しては、そもそも[①要求ページ]が無い状態で認証をしているため、404エラーになっています(何も要求されていない)。
 

(1-2-3) 対策

上述の通り、[①要求ページ]→[②認証画面]→(認証成功)→[③要求ページ]がフォーム認証の基本的な流れなので、そもそも[①要求ページ]でログイン画面自体を要求する事自体が、フォーム認証の使い方として誤っているという事になります(この動きは仕様通り)。

(図124)

そのため、特に修正等はなく、フォーム認証を正しく使えば問題なく動作するはずです。具体的には[①要求ページ]にてログインした先で見るページ(何でも良いです)を要求し、ログイン画面にリダイレクトされる事を確認し、そこからログインすれば元々要求したページが表示されるはずです。
 

(1-3) DataSourceRealm系のエラー

DataSourceRealmに関するエラーについては下記の記事でもご紹介していますので、併せてご参照頂けたらと思います。

(参考)Tomcatのフォーム認証(DataSourceRealm)で403エラー等が発生した場合の対処

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Tomcat

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

TomcatにWARファイルをデプロイする方法

  <目次> (1) TomcatにWARファイルをデプロイする方法  (1-1) STEP1:WARファイルの準備  (1-2) STEP2:WARファイルをサーバ上に配備  (1-3) …

Tomcatのサービスが起動しない場合の想定原因と対処(Linux系OSの例)

<目次> (1) Tomcatのサービスが起動しない場合の想定原因と対処(Linux系OSの例)  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処法 (1) Tomca …

Tomcatの起動時のエラー「アドレスは既に使用中です」や「必要な幾つかのポートがすでに使用中です」の対処方法

<目次> (1) Tomcatの起動時のエラー「アドレスは既に使用中です」や「必要な幾つかのポートがすでに使用中です」の対処方法  (1-1) 発生状況  (1-2) 原因  (1-3) 対処方法 ( …

Tomcatのコネクションプールの設定手順

<目次> (1) Tomcatのコネクションプールの設定手順  (1-1) コネクションプールとは?  (1-2) コネクションプールの設定手順   (1-2-1) context.xmlの記述    …

JSPのコンパイル済ファイルの格納場所(Tomcat単体の場合、Eclipse連携の場合)

<目次> (1) JSPのコンパイル済ファイルの格納場所(Tomcat単体の場合、Eclipse連携の場合)  (1-1) Tomcatを単体で使用している場合  (1-2) Eclipseとアプリケ …

  • English (United States)
  • 日本語
Top