私の Web アプリには、ユーザーが JSP 経由でログインする安全な領域があります。JSP はユーザー名とパスワードをサーブレットに送信し、サーブレットはユーザーの資格情報が有効かどうかを確認します。それらが有効な場合、ユーザーはセキュアなリソースに誘導されます。ユーザーが最初に検証せずに安全なリソースに移動できないようにするにはどうすればよいですか?
4 に答える
一般的なアプローチは、ユーザーのセッションでトークンを設定することです。
session.setAttribute("loggedIn", "true");
あるいは
session.setAttribute("loggedInUser", "someUserName");
保護する必要があるページで確認してください。保護するページにアタッチするサーブレット フィルタを使用してチェックを実行することをお勧めします。チェックに合格しない場合、フィルターはログイン ページにリダイレクトできます。ここも参照してください: http://java.sun.com/products/servlet/Filters.html
これは、認証にフィルターを使用することに関する良い記事です: http://www.developer.com/java/ent/article.php/3467801
web.xml で security-contraint を使用するとどうなりますか :
<security-constraint>
<web-resource-collection>
<web-resource-name>Secure</web-resource-name>
<url-pattern>/secure/*</url-pattern>
</web-resource-collection>
ユーザーが常に単一のサーブレットを介してアプリにアクセスするようにします。サーブレットはリクエストを JSP にディスパッチし、結果のレスポンスをブラウザに返します。この方法では、単一のエントリ ポイントがあるため、何が起こるかを常に制御できます。
別のアプローチは、認証を必要とするすべての JSP によってチェックされるセッション変数 (サーバー側、または Cookie 内) を持つことです。
セキュリティを正しくするのは本当に難しいです。あなたが通常考えているよりもはるかに多く。フレームワーク ( Acegiが頭に浮かびます) の使用、またはLenW が指摘したweb.xml の標準の "" セクションは必須です! 少なくともフィルターを使用して、セキュリティの承認部分を処理してください。
単一のエントリポイントを使用するソリューションはあまり好きではありません(Rolf の提案による)。あなたのアーキテクチャに人為的な制約が課せられているように思えます。また、1 つの Web アプリケーションに複数のサーブレットを含めるには、多くの正当な理由があります。
何をするにしても、すべてのページで手動コードに依存する手法を使用しないでください (「if user_authentified ...」で始まるすべての JSP など)。どこかに置くのを忘れてしまいます...