更新的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,我会看到 重定向后,加载的上下文实际上是新的!出于某种原因(目前我还不知道),此负载在以后的某个时间用旧的安全上下文替换了(?)。
答案 0 :(得分:0)
确保已调用setAuthenticated(true),否则安全上下文不会更新。