2

離れた Web ページからポータルへのリモート ロギングを実行しようとしています。離れた Web ページのユーザーには、ポータルで認証を処理するために送信するログイン/パスワード フィールドがあります。すべてが問題なければ、ログに記録されます。失敗した場合、ポータルの標準ログイン ページにリダイレクトされ、一致する検証エラー (つまり、「無効なログイン/パスワード」) が表示されます。

ポータルのログイン ページに到達するまで、フォームのセキュリティ フィールドがリクエストを介して転送されることを期待して、サーブレットを介して実行しようとしました。

残念ながら、「無効なパスワード/ログイン」エラーが常に発生するため、到達していないようです。

私はSpringの経験がまったくないので、どうすればそれを達成できるか本当にわかりません。BASE 64でエンコードされたデータを介して情報を渡すことを検討するかもしれませんが、それらの情報をSpringに渡す方法もわかりませんし、これが安全な方法であるかどうかもわかりません.

だから、もしあなたの誰かが何か考えを持っているなら、私は喜んでそれを読みます!

リモートフォームコードは次のとおりです。

<form id="connexion">
    <input id="j_username" name="j_username" type="text" value="Email" class="field"/>
    <input id="j_password" name="j_password" type="password" value="Mot de passe" class="field"/>
    <input type="button" class="btn" value="OK" onClick="javascript:register()"/>
</form>


function register(){

  urlSite=http://localhost:8080/monApp/DistantLogingServlet
this.document.location=urlSite

}

サーブレット部分:

 /**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 * @param request 
 * @param response 
 * @throws IOException 
 * @throws ServletException 
 */
 protected final void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {

    final ExternalContext context = FacesUtils.getFacesContext( request, response, servletContext).getExternalContext();

    final RequestDispatcher dispatcher = request.getRequestDispatcher("/j_spring_security_check");

    dispatcher.forward(request, (ServletResponse) context.getResponse());

    FacesContext.getCurrentInstance().responseComplete();
}

ポータルの標準ログイン ページ (jsp):

<h:inputSecret
  id="j_password"
  type="text"
  name="j_password"
  value="#{user.password}"/>

<h:selectBooleanCheckbox
  id="_spring_security_remember_me"
  name="_spring_security_remember_me"
  value="#{user.rememberme}"
  class="float-left" /> 

<h:commandButton
  action="#{user.doLogin}"/>

そしてJava認証部分:

public final String doLogin() throws IOException, ServletException {

    final ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();

    final HttpServletRequest request = ((HttpServletRequest) context.getRequest());

    final RequestDispatcher dispatcher = request.getRequestDispatcher("/j_spring_security_check");

    dispatcher.forward(request, (ServletResponse) context.getResponse());

    FacesContext.getCurrentInstance().responseComplete();

    // It's OK to return null here because Faces is just going to exit.
    return null;

}

ご関心をお寄せいただきありがとうございます。

4

1 に答える 1

1

これは、シングル サインオンのシナリオのようです。

そう。

ユーザーが信頼できるアプリケーションに既にログインしている場合、ポータルにログイン フォームは必要ありません。

これを行うための標準的なアプローチのいくつかはCASまたはOpen IDのいずれかであり、Spring Security は両方をサポートしています。

3 番目の方法は、ユーザーがリモート サイトに正常にログインしたときにユーザーのブラウザーに Cookie を設定し、スプリング フィルターでその Cookie を探すことです。これに通常使用されるフィルターはAbstractPreAuthenticatedProcessingFilter(実際にはサブクラスです) です。

また、Spring Security ドキュメントの事前認証シナリオの部分も紹介します。

于 2012-04-05T09:30:35.180 に答える