使用 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-session整合到Redis

使用 spring-session 和 spring-cloud-security 时,OAuth2ClientContext (spring-security-oauth2) 不会保留在 Redis

初试spring-session

作为 Cognito 验证的一部分,在 SES 中验证电子邮件