2

ユーザーがログインした後、再度アクセスされた場合にリダイレクトを行い、ユーザーがすでに認証/loginされている場合はログインフォームにアクセスできないようにします。

Jetty 8を使用していますが、FormAuthenticator.java:168メソッドvalidateRequestで、ユーザーがログインページまたはエラーページにアクセスした場合、ユーザーが認証されないことがわかりました。

if (isLoginOrErrorPage(URIUtil.addPaths(request.getServletPath(),request.getPathInfo())))
    return Authentication.NOT_CHECKED;

どうすればこれを修正できますか?

4

2 に答える 2

3

私はあなたがしばらく説明した問題に苦労しました...

セッションのAPI、リクエスト、レスポンスを使用して、ユーザーがすでにログインしているときにリダイレクトを実行しようとしましたが、Jettyを使用している場合、ユーザーの認証データがログインページから利用できないようです。

私はJSPとJettyにまったく慣れていません(クラスの割り当てに使用しています)が、理想的なソリューションではないとしても、かなりうまく機能するソリューションを作成しました。

まず、次のJSPを使用して、ログインページに変数を追加し、ページが既に読み込まれているかどうかを確認することで、小さなバイパスを作成しました。

<%
if(session.getAttribute("loginLoadedOnce") == "true")
{
    response.sendRedirect("/redirect.jsp");
}
else
{
    session.setAttribute("loginLoadedOnce", "true");
}
%>

そうすれば、属性が正しく設定されていない場合、ユーザーはログインを試みることができます。それ以外の場合は、リダイレクトページにリダイレクトされます。リダイレクトページにはユーザーデータがあり、ユーザーが特定の役割を持っているかどうかを確認できます。

リダイレクトページのJSPコードは次のようになりました。

<%
if(request.isUserInRole("admin"))
{
    String url = response.encodeRedirectURL("admin/AdminPage.jsp");
    response.sendRedirect(url);
}
else if(request.isUserInRole("accounting"))
{
    String url = response.encodeRedirectURL("/accounting/Mainpage.jsp");
    response.sendRedirect(url);
}
else
{
    // Here the user has no role that we are aware of.
    session.setAttribute("loginLoadedOnce", "false"); // stop redirect loop.
    response.sendRedirect("/login.jsp");
}
%>

ここでは、ユーザーの役割を確認し、役割の正しいページにリダイレクトします。

現在のところ、ユーザーはログインページに戻る前にログアウトする必要があります。ログインページに戻るためのすべての暫定的な結果は、ブラウザの[戻る]ボタンを使用した場合でもリダイレクトされます。

これが誰かを助けることを願っています。

于 2012-11-10T06:25:01.137 に答える
3

この問題は2012-08-07に修正されました。Jettyはここでは意図したとおりに機能しないと思います。そのため、リダイレクト動作に関するバグを報告しました。最新のJetty8をご覧ください。これで動作するはずです。それぞれ、修正をご覧ください。

于 2012-11-11T23:34:20.467 に答える