全て、
私は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にアクセスできないため、多くの面倒な手動構成を行う必要がありました。
これを行うよりエレガントな方法はありますか?