3

Tomcat 7 用のカスタム Realm を作成しました。Tomcat のデフォルト インストールで提供されるロックアウト Realm にラップします。ロックアウト機能は問題なく動作しますが、私の web.xml には

<error-page>
<error-code>403</error-code>
<location>/forbidden.html</location>
</error-page>

これにより、認証されていないすべてのユーザーがページに誘導されます。ただし、正しく認証されたユーザーがロックアウトされている場合は、そのユーザーをページにリダイレクトします。ユーザーが誤って認証されてロックアウトされた場合に、違いを検出できる方法はありますか?

4

3 に答える 3

2

簡単には見えません。私の最初のアイデアは、 をサブクラス化しLockOutRealm、ユーザーがロックアウトされた場合にリクエスト コンテキストに何かを追加して、後でユーザー インターフェイスに出力できるようにすることでした。残念ながら、 のauthenticateメソッドがLockOutRealmログインとパスワードを取得したばかりで、そこにリクエストまたはコンテキスト オブジェクトがないため、機能しません。

別の問題は、認証が失敗したときにauthenticateメソッドが戻り、それも行うことです。認証が失敗した場合の の動作と他のレルムの動作に違いはありません。nullLockOutRealmLockOutRealm

回避策: サーブレット 3.0 を使用している場合は、インターフェースのloginメソッドをHttpServletRequest使用し、ロックアウト ロジックを自分で実装して、サーブレットが を呼び出す前に失敗したログイン試行の回数を確認しますHttpServletRequest.login() 。制限を超えている場合は、 を呼び出してlogin()カスタム エラー メッセージを出力しないでください。

于 2011-10-01T17:46:51.917 に答える
1

このスレッドは非常に古く、私の答えは間違いなく非常に遅れています。ただし、上記を行う1つの方法を列挙します。失敗の理由を提供する認証後のカスタム メッセージは、Tomcat では少し複雑ですが、達成することができます。これを実現する方法の 1 つは、カスタム Tomcat バルブを構築し、それを適切なレベル (ホスト、エンジン、またはコンテキスト) に追加することです。いずれかの Web アプリケーションが FORM 認証を使用する場合、Tomcat は FormAuthentication Valve を処理パイプラインに自動的に挿入します。アイデアは、ブラウザーからの「j_security_check」アクションをインターセプトし、FormAuthentication バルブに到達する前にいくつかの事前検証を行うことです。「invoke」メソッドでは、ユーザー名 (「j_username」) とパスワード (「j_password」) の両方が、要求オブジェクトからクリア テキストとして使用できます。これらを使用すると、アカウントがロックアウトされているかどうか、ユーザーがパスワードなどを変更する必要があるかどうかを、レルム (データベースまたは LDAP など) に直接移動して確認できます。このバルブから、response.redirect() を適切なエラー ページに送信できます。

于 2016-02-08T13:12:22.440 に答える
1

同じ質問があります。リクエストスコープに何かがあるかもしれません。私が Tomcat 5.5 で使用した別のロックアウト レルムの経験があり、それがリクエスト スコープ "com.ofc.tomcat.LOGIN_FAILURE_MESSAGE" に配置され、それが存在しない場合、ユーザーはロックアウトされたに違いありません。

于 2011-12-08T15:25:35.730 に答える