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を使ったフォーム認証でユーザ情報をデータベース管理する方法

<目次> (1) Tomcatを使ったフォーム認証でユーザ情報をデータベース管理する方法  (1-1) 前提条件  (1-2) STEP1:context.xmlにコネクションプールを設定  (1-3 …

JSP Servletでセッションの有効期限を設定する方法

<目次> (1) JSP Servletでセッションの有効期限を設定する方法  (1-1) セッションの有効期限設定の概要  (1-2) 方法1:web.xmlに追記する方法  (1-3) 方法2:プ …

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

<目次> (1) Tomcatのフォーム認証(DataSourceRealm)で403エラー等が発生した場合の対処  (1-1) エラー①:HTTP 403 Forbidden   (1-1-1) 発 …

Tomcatのhttps化をEclipseで設定する方法~JSP/Servletの動的Webプロジェクトをhttpsで疎通する手順~

<目次> (1) Tomcatのhttps化をEclipseで設定する方法~JSP/Servletの動的Webプロジェクトをhttpsで疎通する手順~  (1-0) STEP0:前提事項  (1-1) …

TomcatでEclipseを使う際にserver.xmlを編集しても上書きされる事象の対処方法

<目次> (1) TomcatでEclipseを使う際にserver.xmlを編集しても上書きされる事象の対処方法  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処法 …

  • English (United States)
  • 日本語
Top