Spring Security userCache失效

时间:2011-01-05 17:38:06

标签: java spring spring-security cache-control

使用Spring Security我有DaoAuthenticationProvider描述如下:

http://static.springsource.org/spring-security/site/docs/2.0.x/reference/dao-provider.html

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

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

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

UserDetails user = this.userCache.getUserFromCache(username);

以前有人曾经处理过这个问题吗?我也可以检查密码是否相同,但这是一个自定义的东西。

谢谢。

2 个答案:

答案 0 :(得分:2)

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

  1. 在用户请求到达时,将创建Authentication对象并使用用户提供的用户名和密码填充。

  2. 检索用户详细信息:如果可能,UserCache用于检索以前缓存的用户详细信息(即getUserFromCache或{{1}的实现调用UserDetailsService在执行对AuthenticationProvider的调用之前。并且100%可以从缓存中获得用户详细信息。

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

  4. 但是,如果您实施自己的 AuthenticationAuthenticationProvider,则需要负责密码检查。

答案 1 :(得分:0)

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