使用 Spring-Session 时更新 Session 中的 Principal
Posted
技术标签:
【中文标题】使用 Spring-Session 时更新 Session 中的 Principal【英文标题】:Update Principal in Session when using Spring-Session 【发布时间】:2016-03-21 22:32:24 【问题描述】:我们用我们自己的用户对象扩展了主体。这样,每个请求都可以使用该对象。 当用户更新他的信息时,主体需要使用这些新数据进行更新。不使用 spring-session 时,this method works。但是,对于 spring-session,它不会。
我检查了spring-session代码,RedisOperationsSessionRepository:save(RedisSession session)
只调用session.saveDelta()
,它只保存更改的属性。那么,我们如何更新会话中的委托人呢?
注意——主体更新的地方是在服务层,所以我们无权访问SessionAuthenticationStrategy
。
【问题讨论】:
【参考方案1】:找到了一种方法,所以回答我自己的问题。 Spring-security 将上下文作为属性存储在HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY
中。因此,手动更新密钥(而不是通过 Spring-Session)会导致 Principal 被更新。
httpSession.setAttribute(
HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
SecurityContextHolder.getContext()
);
【讨论】:
以上是关于使用 Spring-Session 时更新 Session 中的 Principal的主要内容,如果未能解决你的问题,请参考以下文章
在使用 spring-session 的单元测试中,身份验证不应为空
使用 spring-session 和 spring-cloud-security 时,OAuth2ClientContext (spring-security-oauth2) 不会保留在 Redis