23

わかった。

安全なURLパターンがあるとしましょう

/secure/link-profile

オプションで、URLパラメータを追加できます。

/secure/link-profile?firstName=Bob&secondName=Smith&membershipNumber=1234

これらのURLパラメータがログインページに引き継がれるようにするにはどうすればよいですか?

/login?firstName=Bob&secondName=Smith&membershipNumber=1234

基本的な前提は、ユーザーを私たちに送るサードパーティとの報酬統合を提供することです。彼らは彼らのサードパーティのアカウント/プロフィールを彼ら/私たちのウェブサイトのユーザーとリンクするためのページに連れて行かれます。ただし、既存のアカウントを持っていない場合は、ログインページでサインアップページに移動し、サードパーティから渡された詳細の一部を事前入力します。

前もって感謝します

スプリングセキュリティ2.0.7.RELEASEスプリングフレームワーク3.1.1.RELEASE

4

4 に答える 4

9

の方法buildRedirectUrlToLoginPage(HttpServletRequest request, ...)を参照してくださいLoginUrlAuthenticationEntryPoint

あなたが達成したいことを正しく理解していれば、サブクラスでこのメソッドをオーバーライドし、元のメソッドをコピーするだけで十分だと思いますが urlBuilder.setQuery(request.getQueryString())、URLをビルドするときに追加で呼び出します。

ExceptionTranslationFilter次に、このカスタマイズされたエントリポイントでを構成するだけで済みます。

于 2013-01-11T18:49:37.503 に答える
5

@zagyiの応答に従って、既存の拡張機能のメソッドをオーバーライドしました。AuthenticationProcessingFilterEntryPoint

オーバーライドするメソッドprotected String determineUrlToUseForThisRequest(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)は、によって呼び出されますbuildRedirectUrlToLoginPage(..

@Override
protected String determineUrlToUseForThisRequest(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException exception) {
    String url = super.determineUrlToUseForThisRequest(request, response, exception);
    return url + "?" + request.getQueryString();
}

明らかに、URL上の既存のクエリ文字列に対応する、ある種のビルダーを使用するように改善することもできますが、現時点では、ログインURLが常に/login/であることがわかっているので、これは私の目的には問題ありません。

于 2013-01-11T19:50:25.250 に答える
5

別の記事では、オーバーライドがどのように機能しないかを説明しています。beginをオーバーライドする必要がありました。これはおそらく、SpringSecurityの新しいバージョンで導入された新しいものかもしれません。

public class SecurityConfig extends WebSecurityConfigurerAdapter {
    protected void configure(final HttpSecurity httpSecurity) throws Exception {
    httpSecurity.
    formLogin().loginPage("/signIn").permitAll().
        and().
            authorizeRequests().
            antMatchers(managementContextPath + "/**").permitAll().
            anyRequest().authenticated().withObjectPostProcessor(objectPostProcessor).
        and().
            csrf().disable().
            contentTypeOptions().
            xssProtection().
            cacheControl().
            httpStrictTransportSecurity().
        and().
            requestCache().requestCache(new RedisRequestCache(savedRequestRedisTemplate())).
        and().
            sessionManagement().sessionAuthenticationStrategy(sessionAuthenticationStrategy).
        and().
            exceptionHandling().authenticationEntryPoint(new AuthenticationProcessingFilterEntryPoint("/signIn"));
    }
}
パブリッククラスAuthenticationProcessingFilterEntryPointはLoginUrlAuthenticationEntryPointを拡張します{
    public AuthenticationProcessingFilterEntryPoint(String loginFormUrl){
        super(loginFormUrl);
    }

    @オーバーライド
    public void begin(HttpServletRequest request、HttpServletResponse response、AuthenticationException authException)はIOException、ServletException{をスローします
        RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
        redirectStrategy.sendRedirect(request、response、getLoginFormUrl()+ "?" + request.getQueryString());
    }
}

Rizier123、ポインタをありがとう。

于 2014-12-19T04:20:36.353 に答える
0

こんにちはカバル-

私は非常によく似た要件を持っており、あなたとza​​gyiライオンの投稿に従いましたが、それでも/loginページの元のリクエストパラメータを失っているようです。

これが私が持っているものです:

public class AuthenticationProcessingFilterEntryPoint extends LoginUrlAuthenticationEntryPoint {
    @Override
    protected String determineUrlToUseForThisRequest(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) {
        String url = super.determineUrlToUseForThisRequest(request, response, exception);
        return url + "?" + request.getQueryString();
    }
}



protected void configure(final HttpSecurity httpSecurity) throws Exception {
    httpSecurity.
    formLogin().loginPage("/signIn").permitAll().
        and().
            authorizeRequests().
            antMatchers(managementContextPath + "/**").permitAll().
            anyRequest().authenticated().withObjectPostProcessor(objectPostProcessor).
        and().
            csrf().disable().
            contentTypeOptions().
            xssProtection().
            cacheControl().
            httpStrictTransportSecurity().
        and().
            requestCache().requestCache(new RedisRequestCache(savedRequestRedisTemplate())).
        and().
            sessionManagement().sessionAuthenticationStrategy(sessionAuthenticationStrategy).
        and().
            addFilter(new ExceptionTranslationFilter(new AuthenticationProcessingFilterEntryPoint()));
}

AuthenticationProcessingFilterEntryPointがデプロイされていることがわかりますが、ブレークポイントに到達していません。

ドキュメントに基づくと、AuthenticationExceptionまたはAccessDeniedExceptionがある場合にのみこれが開始されるようです。上記の構成では、そのような場合にスプリングが内部でそのような例外をスローするかどうかはわかりません。

さらに、認証が成功したかどうかに関係なく、ランディングページのクエリパラメータを保持したいと思います。

私は成功と失敗のハンドラーを追加しましたが、どれも実行に移されませんでした。

protected void configure(final HttpSecurity httpSecurity) throws Exception {
    httpSecurity.
    formLogin().
        successHandler(new PropogateQueryStringAuthenticationSuccessHandlerImpl()).
        failureHandler(new SimpleUrlAuthenticationFailureHandlerImpl(new QueryStringPropagateRedirectStrategy())).
    and().
        authorizeRequests().
        antMatchers(managementContextPath + "/**").permitAll().
        anyRequest().authenticated().withObjectPostProcessor(objectPostProcessor).
    and().
        csrf().disable().
        contentTypeOptions().
        xssProtection().
        cacheControl().
        httpStrictTransportSecurity().
    and().
        requestCache().requestCache(new RedisRequestCache(savedRequestRedisTemplate())).
     and().
        sessionManagement().sessionAuthenticationStrategy(sessionAuthenticationStrategy);
}

Spring Boot 1.1.6.RELEASEでSpring-Security3.2.4.RELEASEを使用しています(Spring Framework 4.0.7.RELEASEを使用しています)

ありがとう、サン

于 2014-12-17T05:52:04.690 に答える