4

全て、

私はRemember Me機能を実装しようとしています

2 つの保護された URL があります。

/operation/fully (ユーザーは完全に認証されている必要があり、remember me は許可されていません)

/operation/authenticated (私を覚えておいてください)

覚えている Cookie がなく、いずれかの URL にアクセスすると、資格情報の入力を求められ、元の URL にリダイレクトされます。

私が記憶モードになっている場合は、/operation/authenticated に問題なく移動できます。/operation/full に移動すると、ログイン ページにリダイレクトされます。その後、認証して「/」に戻ります。元のターゲット/操作/完全に戻りたいです。

<http auto-config="true" use-expressions="true" access-denied-page="/login">
    <form-login login-page="/login" 
                login-processing-url="/static/j_spring_security_check"  
                authentication-failure-url="/login" />
    <logout logout-url="/j_spring_security_logout" logout-success-url="/logout"/>   
    <intercept-url pattern="/favicon.ico" access="permitAll" />
    <intercept-url pattern="/operations/fully" access="hasRole('ROLE_USER') and isFullyAuthenticated()"/>
    <intercept-url pattern="/operations/authenticated" access="hasRole('ROLE_USER')"/>
    <intercept-url pattern="/login" />  
    <remember-me key="myKey"
        token-validity-seconds="2419200" />    
 </http>

どういうわけか、ユーザーが完全に認証されていないときに、元の要求された URL にユーザーを戻す必要があります。これを行うための最良のアプローチに関するアイデアはありますか?

私は1つの解決策を思いつきましたが、必要以上の仕事のように思えて、うんざりします.

私のシナリオでは、ExceptionTranslationFilterはログイン プロセスを呼び出していないため、元の URL を保存していません。

次の行は呼び出されません

    requestCache.saveRequest(request, response);

代わりに、構成を介してキャッチし、ユーザーをログインページに送信していた403が生成されます。私の場合、ユーザーは匿名であるかのように扱われ、403 は生成されず、ログイン プロセスが開始されます。

この動作を変更する最も簡単な方法は、AuthenticationTrustResolverImplを変更することでした。

    public boolean isAnonymous(Authentication authentication) {
        if ((anonymousClass == null) || (authentication == null)) {
            return false;
        }

            //if this is a RememberMe me situation, the user should be treated as 
            //if they were anonymous
        if (this.isRememberMe(authentication)){
            return true;
        }

        return anonymousClass.isAssignableFrom(authentication.getClass());
    }

これはまさに私が望んでいることのようですが、http 名前空間を使用している場合はExceptionTranslationFilterにアクセスできないため、多くの面倒な手動構成を行う必要がありました。

これを行うよりエレガントな方法はありますか?

4

1 に答える 1