更新的Spring安全上下文在重定向会话中不可用

时间:2019-06-18 13:25:22

标签: spring spring-security

更新的Spring安全上下文在重定向上不可用

在我的一个控制器中-重定向之前-我执行以下代码:

Credential oldCredential = (Credential) authentication.getCredentials();
            Authentication authenticationToken = new AuthenticationToken(new Credential(oldCredential.getCookieValue(), oldCredential.getPassword()),
                    updatedAccountDetails);
            SecurityContextHolder.getContext().setAuthentication(authenticationToken);

设置身份验证对象后,我会看到身份验证上下文已正确更新。执行完上面的代码后,我将重定向。 重定向完成后,加载的安全上下文就是旧的!也就是说:当我检查安全上下文时,它包含 not 新的身份验证令牌。

如果我进行以下测试:-在setAuthentication(...)之后添加setAttributE(...)-我在会话中获得了新的authenticationToken,但是(显然)使用了另一个密钥:test。我尝试了一些用于SecurityContextHolder的策略(MODE_THREADLOCAL,MODE_INHERITABLETHREADLOCAL,MODE_GLOBAL),尽管我认为默认的MODE_THREADLOCAL适合我的应用程序。

request.getSession(false).setAttribute("test", authenticationToken);

奇怪的是,如果我调试并检入HttpSessionSecurityContextRepository的SecurityContextPersistenceFilter,我会看到 重定向后,加载的上下文实际上是新的!出于某种原因(目前我还不知道),此负载在以后的某个时间用旧的安全上下文替换了(?)。

1 个答案:

答案 0 :(得分:0)

确保已调用setAuthenticated(true),否则安全上下文不会更新。