3

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

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

AbstractUserDetailsAuthenticationProvider$DefaultPreAuthenticationChecks()我认为我刚刚发现的内部类存在一个错误,如下所述:

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

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

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

谢谢罗伯

编辑

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

4

1 回答 1

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。如果我没记错的话,这甚至是不可能通过纯粹使用命名空间配置来实现的(如果没有明确设置,则有一个默认值)。

于 2013-02-18T11:27:23.847 回答