Spring security 应为BadCredentialsException,但获得AccountExpiredException

Spring security 应为BadCredentialsException,但获得AccountExpiredException,spring-security,Spring Security,我正在使用Spring Security在我的应用程序中支持身份验证和授权。我已经定制了安全上下文的几个方面,但我认为这在我的问题中不起作用 我目前正在使用Spring 3.1.2.RELEASE和Spring Security 3.1.3.RELEASE,但我即将更新到最新版本 我认为我刚刚发现的AbstractUserDetailsAuthenticationProvider$DefaultPreAuthenticationChecks()内部类有一个bug,如下所述: 如果我尝试使用一个用

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

我目前正在使用Spring 3.1.2.RELEASESpring Security 3.1.3.RELEASE,但我即将更新到最新版本

我认为我刚刚发现的
AbstractUserDetailsAuthenticationProvider$DefaultPreAuthenticationChecks()
内部类有一个bug,如下所述:

如果我尝试使用一个用户和一个错误(不正确)的密码登录,但在我的用户存储库中找到了该用户,并且该用户被锁定、禁用或帐户已过期,则Spring Security会以
LockedException
DisableException
AccountExpiredException
响应

然而,从这个响应中,我刚刚确定用户存在于存储库中,尽管我刚刚猜到了密码,但还不知道它是对还是错!相反,Spring安全性应该主要使用
BadCredentialsException
进行响应,并且仅当凭据经过身份验证时,才会使用锁定、禁用或帐户过期的异常进行响应

有没有其他人看到/报告过这种行为?我已经搜索过了,但是到处都找不到

谢谢 抢劫

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

只有当异常消息进入HTTP响应时,这才是一个问题。如果您使用默认的命名空间配置(
),则检查代码表明情况并非如此,因为攻击者得到的所有响应都是对登录页面的HTTP重定向,而不管服务器端抛出了哪种类型的
AuthenticationException

但是,阅读代码表明,可以通过某种方式配置
AuthenticationFailureHandler
,从而暴露此信息。
来自
SimpleRuthenticationFailureHandler.onAuthenticationFailure()的代码段


如果你的意思是这个问题,那么我认为你是对的,因为发回异常消息肯定比客户端看到的要多。尽管开发人员必须做出一些努力来实现这种不安全的行为,即将
defaultFailureUrl
设置为null。如果我没有弄错的话,仅仅使用名称空间配置是不可能的(如果没有显式设置,则会有一个默认值)。

谢谢Zagyi。这是真的,但在我的应用程序中,我希望将用户重定向回登录页面,并根据
AuthenticationException
的类型显示相关错误。我正在使用
SimpleRuThenticationFailureHandler
并根据收到的异常设置页面。我认为这是使用
AuthenticationFailureHandler
的一种相当标准的方法。虽然我同意开发人员必须做出一些努力来暴露此漏洞,但我认为所做的努力是相当标准的!。谢谢。啊,好的,我知道了如果您想通知用户不同的
AccountStatusException
s,但前提是所提供的凭据是可接受的,那么您就有问题了。图书馆的作者经常在这里回答问题,但用JIRA票证可能更容易吸引他们的注意力,我想这一问题应该是一张票证。作为旁注:我想
例外的AppingAuthenticationFailureHandler
SimpleLauthenticationFailureHandler
更适合您的用例。对不起,是的,我确实为此使用了
ExceptionMappingAuthenticationFailureHandler
。当我发布一张JIRA罚单时,我会参考它进行更新。谢谢你的回复。
    if (defaultFailureUrl == null) {
        logger.debug("No failure URL set, sending 401 Unauthorized error");

        response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
           "Authentication Failed: " + exception.getMessage());
    }