Java Spring安全用户缓存失效

Java Spring安全用户缓存失效,java,spring,spring-security,cache-control,Java,Spring,Spring Security,Cache Control,使用Spring Security,我有一个DaoAuthenticationProvider,如下所述: 我也有缓存(就像那篇文章中描述的那样) 问题是,当一个请求带有一个好的用户名(已经在缓存中)但密码不正确时,它会从缓存中返回用户,就像它是一个好的用户名/密码一样。因为它使用用户名作为密钥,所以根本不涉及密码 从缓存返回用户的确切代码: UserDetails user = this.userCache.getUserFromCache(username); 以前有人处理过这个问题吗?

使用Spring Security,我有一个
DaoAuthenticationProvider
,如下所述:

我也有缓存(就像那篇文章中描述的那样)

问题是,当一个请求带有一个好的用户名(已经在缓存中)但密码不正确时,它会从缓存中返回用户,就像它是一个好的用户名/密码一样。因为它使用用户名作为密钥,所以根本不涉及密码

从缓存返回用户的确切代码:

UserDetails user = this.userCache.getUserFromCache(username);
以前有人处理过这个问题吗?我也可以检查密码是否相同,但这将是一个自定义的东西


谢谢。

最初从数据库获取用户并将其缓存的代码是什么?它检查密码了吗?听起来您有一个抽象问题-Spring安全性不应该知道用户来自哪里(DB或缓存),并且应该使用相同的逻辑。

如果您使用标准组件配置应用程序,则场景应如下所示:

  • 在用户请求到达时,将创建
    身份验证
    对象,并使用用户提供的用户名和密码填充该对象

  • 检索用户详细信息:如果可能,
    UserCache
    用于检索以前缓存的用户详细信息(即,
    getUserFromCache
    在调用
    AuthenticationManager
    之前由
    UserDetailsService
    AuthenticationProvider
    的实现调用)。而且,缓存中的用户详细信息将与良好的密码一起提供,这是100%确定的

  • 在基本的预身份验证检查(凭据过期等)之后,将进行实际身份验证。此时,将缓存的用户详细信息中的密码与所提供的
    身份验证
    对象(当前包含错误的密码)中存储的密码进行比较。此时,身份验证尝试失败


  • 但是,如果您实现了自己的
    AuthenticationProvider
    AuthenticationManager
    ,则您需要负责密码检查。

    是,最初会获取密码并缓存用户对象(以及密码)。但是,当出现以下请求时,Spring会根据用户名检查用户是否缓存,如果用户在缓存中,则会假定身份验证成功。这就是问题所在。是否每个请求都发送用户名和密码?如果是这样的话,我想缓存是没有意义的。如果你想保存DAO调用,缓存是有意义的。最后我不得不自己检查密码,因为我有一个自定义的AuthenticationProvider。谢谢