0

使用 Spring Security 我有一个这样的DaoAuthenticationProvider描述:

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

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

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

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

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

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

谢谢你。

4

2 回答 2

2

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

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

  2. 检索用户详细信息:如果可能,UserCache用于检索以前缓存的用户详细信息(即getUserFromCache由实现调用UserDetailsService或在执行调用AuthenticationProvider 之前调用AuthenticationManager)。缓存中的用户详细信息将带有正确的密码,这是 100% 可以的。

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

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

于 2011-01-06T14:45:20.400 回答
0

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

于 2011-01-05T19:25:19.390 回答