Spring会话:立即更新redis中登录的用户对象

Spring会话:立即更新redis中登录的用户对象,spring,spring-security,spring-session,Spring,Spring Security,Spring Session,我有两个web应用程序(A和B)。 第一个web应用程序(A)使用SpringCloud作为反向代理。 我使用spring会话将两个应用程序的会话存储在redis数据库中 问题 当我修改当前(登录)用户的字段(例如名称)时,当前登录用户对象不会立即更新,因此,当我试图在下一次调用中检索当前登录用户时(通过@AuthenticationPrincipal),我会得到一个未更新的用户对象 我的自定义用户详细信息对象: public class CustomUserDetails extends my

我有两个web应用程序(A和B)。 第一个web应用程序(A)使用SpringCloud作为反向代理。 我使用spring会话将两个应用程序的会话存储在redis数据库中

问题
当我修改当前(登录)用户的字段(例如名称)时,当前登录用户对象不会立即更新,因此,当我试图在下一次调用中检索当前登录用户时(通过@AuthenticationPrincipal),我会得到一个未更新的用户对象

我的自定义用户详细信息对象:

public class CustomUserDetails extends my.package.User implements org.springframework.security.core.userdetails.UserDetails, java.io.Serializable { 
// ...
}

如何立即更新当前用户对象?

最近我遇到了类似的问题,我通过以下方式解决了它:

1.创建了自定义身份验证类

public class MyCustomAuthentication implements Authentication {

    private UserDetails userDetails;

    public MyCustomAuthentication(UserDetails userDetails) {
        this.userDetails = userDetails;
    }
    ...
    @Override
    public Object getDetails() { return userDetails; }

    @Override
    public Object getPrincipal() { return userDetails; }

    @Override
    public boolean isAuthenticated() { return true; }
    ...
 }
  • 用一些新数据更新userDetails对象(我猜在您的例子中是“name”)
  • 设置从SecurityContextHolder中的userDetails创建的新身份验证

     SecurityContextHolder.getContext().setAuthentication(new MyCustomAuthentication(userDetails));
    
  • 希望这对你有所帮助