11

ログインに成功してページにリダイレクトするという奇妙な問題があります。

以下は私の春のセキュリティ構成です。

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/login.hst**" access="anonymous or authenticated" />
    <intercept-url pattern="/**/*.hst" access="authenticated" />
    <form-login login-page="/login.hst"
        authentication-failure-url="/login.hst?error=true"
        authentication-success-handler-ref="loginSucessHandler" />
    <logout invalidate-session="true" logout-success-url="/home.hst"
        logout-url="/logout.hst" />
    <remember-me key="jbcpHaverERP" authentication-success-handler-ref="loginSucessHandler"/>
    <session-management>
    <concurrency-control max-sessions="1" />
</session-management>
</http>

LoginSuessHandler クラス:

@Service
public class LoginSucessHandler extends
        SavedRequestAwareAuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request,
            HttpServletResponse response, Authentication authentication)
            throws ServletException, IOException {
            ...
        super.setUseReferer(true);
        super.onAuthenticationSuccess(request, response, authentication);
    }

}

成功時に要求されたページにリダイレクトされる問題が発生しました。安全なURLを直接参照すると、Springがログインページにリダイレクトし、ログインに成功すると元の要求されたリンクにリダイレクトします。ただし、ユーザーが以前に「remember-me」を選択し、ブラウザを閉じて直接 URL を要求している場合、これは機能しません。ユーザーは適切に認証されていますが、要求されたページにリダイレクトする代わりに、Spring が / にリダイレクトします。ログといくつかのスプリング ソース コードを確認したところ、ターゲット URL を特定できないことがわかりました。

refer を設定しようとしましたが、referer の値が null です。しかし、奇妙なことに、春のセキュリティ構成で、remember-me 構成から authentication-success-handler を削除すると、機能することに気付きました。

    <remember-me key="jbcpHaverERP" authentication-success-handler-ref="loginSucessHandler"/>

問題を把握できません。authentication-success-handler の実装はフォームログインとremember-meで異なる必要がありますか?

4

4 に答える 4

15

Remember-me は、ユーザーが行う実際のリクエスト中に認証が行われるという点で form-login とは異なります。フォーム ログインの場合、ユーザーは最初にログイン ページにリダイレクトされ、ログイン フォームを送信する必要があります。その後、元のターゲット (通常はセッションにキャッシュされます) にリダイレクトされます。したがって、form-login にはリダイレクトが必要ですが、remember-me には必要ありません。記憶要求を使用すると、ユーザーを認証でき、介入なしで要求を続行できます。

の主な目的は、AuthenticationSuccessHandler認証後のナビゲーション フローを制御することです。そのため、通常、remember-me ではまったく使用しません。SavedRequestAwareAuthenticationSuccessHandler保存されたリクエストが利用できないため、を使用することはお勧めできません。保存されたリクエストがない場合、デフォルトで「/」へのリダイレクトが実行されます。

あなたが望むのは、remember-me ログイン中に何らかの機能を追加することだけである場合はAuthenticationSuccessHandler、リダイレクトや転送を実行せずにインターフェースを直接実装できます。上で説明したように、同じ実装を form-login に使用することはできません。現在のリクエストはログイン フォームの送信 (通常は URL への送信j_spring_security_check) であり、アプリケーション内の URL へのリクエストではないためです。そのため、フォーム ログインのリダイレクトが必要です。

于 2012-07-26T22:14:21.060 に答える
13

むしろApplicationListener、イベントを使用して探しますInteractiveAuthenticationSuccessEvent

InteractiveAuthenticationSuccessEventgeneratedByフィルターとなるプロパティがあります。つまり、 UsernamePasswordAuthenticationFilter(フォームログイン) およびRememberMeAuthenticationFilter(remeber me logins)

@Component
class AuthenticationApplicationListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

  @Override
  void onApplicationEvent(InteractiveAuthenticationSuccessEvent event) {
    //do something
  }

}

AuthenticationSuccessHandleron rememberMeのカスタム実装を使用すると、問題が発生します。の流れをご覧くださいRememberMeAuthenticationFilter。を使用するsuccessHandlerと、フィルタ チェーンがバイパスされます。

于 2013-05-16T14:58:37.720 に答える
1

ログインフォームとremember-meに対して異なる認証成功ハンドラーを実装する必要があります。remeber-me ハンドラーでリダイレクトを実行する場合は、SimpleUrlAuthenticationSuccessHandler を使用して DefaultTargetUrl を設定できます。

public class RememberMeAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
    Authentication authentication) throws IOException, ServletException {

    // ...

    super.setAlwaysUseDefaultTargetUrl(true);
    super.setDefaultTargetUrl(request.getRequestURL().toString());
    super.onAuthenticationSuccess(request, response, authentication);
}
于 2014-07-26T00:36:16.407 に答える