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

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

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

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

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

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

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

谢谢。

有帮助吗?

解决方案

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

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

  2. 检索用户详细信息:如果它是可能的, UserCache 用于检索以前缓存的用户详细信息(即 getUserFromCache 由以下实现调用 UserDetailsService 或者 AuthenticationProvider 打电话给 AuthenticationManager 被执行)。缓存中的用户详细信息与正确的密码一起出现是 100% 正确的。

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

但是,如果您实施 你自己 AuthenticationProvider 或者 AuthenticationManager, ,您负责密码检查。

其他提示

什么是代码最初获取用户从数据库和缓存呢?是否检查密码?喜欢你的声音有一个抽象的问题 - 春季安全不应该知道用户是从(DB或高速缓存)来了,应该使用相同的逻辑无论哪种方式

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top