全部,
我正在尝试实现记住我的功能
我有两个受保护的网址。
/operation/fully
(用户必须经过完全身份验证,不允许记住我)
和
/operation/authenticated
(记住我好)
如果我不记得我的 cookie 并且我访问了任一 URL,我会提示我输入我的凭据并重定向到原始 URL 生活是好的。
如果我处于记住我模式,我可以导航到 /operation/authenticated 没问题。如果我导航到 /operation/fully 我被重定向到登录页面。然后我进行身份验证并返回到“/”我想回到我原来的目标/操作/完全。
<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。关于最佳方法的任何想法?
我想出了一个解决方案,但它让我感到畏缩,因为它看起来比应该做的工作更多。
在我的场景中,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,因此我不得不进行大量繁琐的手动配置。
有没有更优雅的方法来做到这一点?