【发布时间】:2016-05-13 00:33:40
【问题描述】:
我最近在我雇主的一个基于 Spring 的 Java 应用程序中实现了一些安全改进,并且我覆盖了 Spring Security 的 AbstractUserDetailsAuthenticationProvider 类,以便围绕用户身份验证进行一些额外的处理。在此过程中,我意识到DefaultPreAuthenticationChecks 内部类在身份验证提供程序运行通过验证密码的additionalAuthenticationChecks 方法之前执行用户帐户检查。如果用户被禁用、过期或锁定,则会抛出异常,从而将相关消息显示在屏幕上。对我来说,在成功验证密码之前检查用户帐户并提供此帐户的详细信息是一种公然的安全风险,因为它可能会暴露用户帐户是否存在。有谁知道 Spring Security 可能以这种方式做事的充分理由?显然,我可以通过创建自己的虚拟类来覆盖 DefaultPreAuthenticationChecks 类,方法是使用什么都不做的 check 方法,但遗憾的是,这必须首先完成。
提前致谢。
附:我在相关注释here 上发现了一个问题,但似乎没有人问这个问题为什么存在这个潜在的安全漏洞。
【问题讨论】:
-
可能是性能问题。如果用户被禁用,那么不要进行昂贵的 bcrypt 操作?
-
这很好,但我宁愿先检查一下,这样我们才能确保尝试访问帐户的人至少知道密码。然后我们知道它可能是授权帐户持有人是安全的,因此我们可以很高兴地告诉他们该帐户不幸被锁定或禁用。我想这是对速度的选择,而不是额外的安全性和处理。每次进行身份验证时,我都会选择后者!
标签: java spring security spring-security