我正在使用Spring Security来支持我的应用程序中的身份验证和授权。我已经定制了安全上下文的几个方面,但我不认为这在我的问题/问题中起作用。
我目前正在使用 Spring 3.1.2.RELEASE 和 Spring Security 3.1.3.RELEASE ,但我即将更新到最新版本。< / p>
我认为我刚刚找到的AbstractUserDetailsAuthenticationProvider$DefaultPreAuthenticationChecks()
内部类有一个错误,如下所述:
如果我尝试使用用户和密码错误(不正确)登录,但是在我的用户存储库中找到了该用户,并且他们已被锁定,已禁用或帐户已过期,则Spring Security会以{ {1}},LockedException
或DisabledException
。
然而,从这个回复中,我刚刚确定用户存在于存储库中,即使我只是猜到了密码,但还不知道它是对还是错!相反,Spring Security应主要使用AccountExpiredException
进行响应,并且仅当凭据通过身份验证时才会响应锁定,禁用或帐户过期的异常。
还有其他人看过/报告过这种行为吗?我已经搜索过,但在任何地方都看不到这个!
由于 罗布
我刚刚升级到 Spring 3.2.1.RELEASE 和 Spring Security 3.2.0.M1 ,此行为仍然保持不变。
答案 0 :(得分:1)
如果异常的消息进入HTTP响应,这只会是一个问题。正在考虑代码表明,如果您使用默认命名空间配置(<security:form-login>
)则不是这种情况,因为所有攻击者获得的响应都是HTTP重定向到登录页面,无论AuthenticationException
是什么类型被扔在服务器端。
但是,阅读代码表明,可以以导致此信息曝光的方式配置AuthenticationFailureHandler
。
来自SimpleUrlAuthenticationFailureHandler.onAuthenticationFailure()
的代码段:
if (defaultFailureUrl == null) {
logger.debug("No failure URL set, sending 401 Unauthorized error");
response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
"Authentication Failed: " + exception.getMessage());
}
如果你的意思是这个问题,那么我认为你是对的,因为发送回异常消息肯定比客户端应该看到的更多。虽然开发人员必须努力实现这种不安全的行为,即将defaultFailureUrl
设置为null。如果我没有弄错的话,纯粹使用命名空间配置甚至不可能(如果未明确设置,则存在默认设置)。