10

Java サーブレットでフォーム認証を行う標準的な方法は何ですか?

今から、単純な POST HTML フォームを使用して自分で実装しました。

  1. 送信されたパラメーターをデータベースに対してチェックする
  2. 存在する場合は、User オブジェクトを HttpSession に保存します
  3. このオブジェクトが存在するかどうかをすべてのサーブレットでチェックします
  4. そうでない場合: ログイン ページにリダイレクトし、エラー メッセージを表示します。

しかし、組み込みの Jetty を使用してセキュリティを構成する方法につまずき、その問題に対して既に実装されているソリューションを再利用できると考えていますが、ここでの標準的なアプローチは何ですか? 私自身も Jetty を使用していますが、Tomcat やその他の Web サーバーはどうですか?

j_security_checkについても読みましたが、それは何ですか? それはレガシーメソッドですか?

4

3 に答える 3

14

Tomcat、Websphere、Glassfish などのサーブレット コンテナーによって提供される JAAS セキュリティを使用する必要があります。

デフォルトでは、これらのコンテナーは次の認証タイプをサポートしています。

  • ベーシック
  • ダイジェスト
  • クライアント証明書

HTTP 基本認証

HTTP 基本認証を指定するには、サーバーが Web クライアントからユーザー名とパスワードを要求し、指定されたレルムまたはデフォルト レルム内の許可されたユーザーのデータベースと比較して、ユーザー名とパスワードが有効であることを確認する必要があります。

認証メカニズムを指定しない場合、基本認証がデフォルトです。

基本認証を使用すると、次のアクションが発生します。

  1. クライアントは、保護されたリソースへのアクセスを要求します。
  2. Web サーバーは、ユーザー名とパスワードを要求するダイアログ ボックスを返します。
  3. クライアントは、ユーザー名とパスワードをサーバーに送信します。4.\サーバーは、指定されたレルムでユーザーを認証し、成功した場合は、要求されたリソースを返します。

次の図は、HTTP 基本認証を指定した場合の動作を示しています。 ここに画像の説明を入力

HTTP 基本認証 クライアントとサーバー間の HTTP 基本認証の 4 つのステップの図

フォームベースの認証

フォームベースの認証を使用すると、開発者は、HTTP ブラウザーがエンド ユーザーに表示するログイン画面とエラー ページをカスタマイズすることで、ログイン認証画面のルック アンド フィールを制御できます。フォームベース認証が宣言されると、次のアクションが発生します。

  1. クライアントは、保護されたリソースへのアクセスを要求します。
  2. クライアントが認証されていない場合、サーバーはクライアントをログイン ページにリダイレクトします。
  3. クライアントは、ログイン フォームをサーバーに送信します。
  4. サーバーはユーザーの認証を試みます。
  5. 認証が成功すると、認証されたユーザーのプリンシパルがチェックされ、リソースへのアクセスが承認されたロールに含まれていることが確認されます。ユーザーが許可されている場合、サーバーは保存されている URL パスを使用してクライアントをリソースにリダイレクトします。
  6. 認証に失敗すると、クライアントはエラー ページに転送またはリダイレクトされます。

次の図は、フォームベースの認証を指定した場合に何が起こるかを示しています。

ここに画像の説明を入力

フォームベースのログインを作成するときは、Cookie または SSL セッション情報を使用してセッションを維持してください。

認証が適切に行われるためには、ログイン フォームのアクションが常に j_security_check である必要があります。この制限は、ログイン フォームが対象のリソースに関係なく機能し、サーバーが送信フォームのアクション フィールドを指定する必要がないようにするために行われます。次のコード スニペットは、フォームを HTML ページにコーディングする方法を示しています。

<form method="POST" action="j_security_check">
  <input type="text" name="j_username">
  <input type="password" name="j_password">
</form>

ダイジェスト認証

基本認証と同様に、ダイジェスト認証は、ユーザー名とパスワードに基づいてユーザーを認証します。ただし、基本認証とは異なり、ダイジェスト認証はネットワーク経由でユーザー パスワードを送信しません。代わりに、クライアントはパスワードと追加データの一方向暗号化ハッシュを送信します。パスワードはネットワーク上で送信されませんが、ダイジェスト認証では、予想されるダイジェストを計算することによって受信したオーセンティケーターを検証できるように、クリアテキストのパスワードに相当するものを認証コンテナーで使用できる必要があります。

参考文献:

于 2012-06-25T05:13:08.023 に答える
1

サーブレットフィルタを使用してみてください。JAASや他のスタッフを設定する必要はありません。

于 2012-06-25T05:41:35.977 に答える
-1

ユーザーに関するデータがデータベースに存在しない場合にのみ、エラー ページへの転送を試みます。ユーザーが見つかった場合は、次のコードを使用してユーザーを「ホーム」ページにリダイレクトします

RequestDispatcher dis = request.getRequestDispatcher("relativeURL2Jsp");
dis.forward(request, response);
于 2012-06-25T05:15:32.020 に答える