Spring Security在RequireFully授权后记住我的重定向

时间:2013-05-22 21:14:56

标签: spring spring-mvc spring-security

全部,

我正在尝试实现记住我的功能

我有两个受保护的网址。

/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 ,我不得不进行大量凌乱的手动配置。

有更优雅的方法吗?

1 个答案:

答案 0 :(得分:0)

为Spring Security 4.2.0 M1安排PR来满足这一需求。它的关联提交可能提供了在Spring Security早期版本中实现相同功能的提示。