期望BadCredentialsException,但得到了AccountExpiredException

时间:2013-02-18 10:39:31

标签: spring-security

我正在使用Spring Security来支持我的应用程序中的身份验证和授权。我已经定制了安全上下文的几个方面,但我不认为这在我的问题/问题中起作用。

我目前正在使用 Spring 3.1.2.RELEASE Spring Security 3.1.3.RELEASE ,但我即将更新到最新版本。< / p>

我认为我刚刚找到的AbstractUserDetailsAuthenticationProvider$DefaultPreAuthenticationChecks()内部类有一个错误,如下所述:

如果我尝试使用用户和密码错误(不正确)登录,但是在我的用户存储库中找到了该用户,并且他们已被锁定,已禁用或帐户已过期,则Spring Security会以{ {1}},LockedExceptionDisabledException

然而,从这个回复中,我刚刚确定用户存在于存储库中,即使我只是猜到了密码,但还不知道它是对还是错!相反,Spring Security应主要使用AccountExpiredException进行响应,并且仅当凭据通过身份验证时才会响应锁定,禁用或帐户过期的异常。

还有其他人看过/报告过这种行为吗?我已经搜索过,但在任何地方都看不到这个!

由于 罗布

修改

我刚刚升级到 Spring 3.2.1.RELEASE Spring Security 3.2.0.M1 ,此行为仍然保持不变。

1 个答案:

答案 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。如果我没有弄错的话,纯粹使用命名空间配置甚至不可能(如果未明确设置,则存在默认设置)。