Spring ldap身份验证失败错误代码

时间:2010-12-14 21:40:00

标签: java spring active-directory adam spring-ldap

我正在使用Spring LDAP(1.3.1)与ADAM和Active Directory进行通信。

当我尝试使用ldapTemplate.authenticate()对某人进行身份验证时,我通过错误回调得到了错误,但是它提供了一个非常通用的异常AuthenticationException,我无法提取究竟是什么问题:

  • 帐户已停用
  • 密码已过期
  • 必须在下次登录时更改密码
  • 帐户已过期

我得到的全部是一个detailMessage,我假设是AD发回的。类似的东西:

  

org.springframework.ldap.AuthenticationException:   [LDAP:错误代码49 - 8009030C:   LdapErr:DSID-0C0903A9,评论:   AcceptSecurityContext错误,数据773,   v1db0

我可以看到数据773,这意味着用户必须在下次登录时更改密码。我不想手动解析它。有没有我不知道的“适配器”?

有没有人遇到过这个问题?

非常感谢!

2 个答案:

答案 0 :(得分:4)

This link列出了ldap错误代码如何映射到JNDI异常。查看spring ldap代码,spring似乎将每个JNDI异常映射到其自定义LDAP异常(LdapUtils.convertLdapException()

现在,773似乎与Active Directory有关。因此,如果需要,这需要由用户明确地处理。 This link列出了一堆Active Directory错误。 Spring ldap将在其错误详细信息中提供此文本,让用户可以使用它们。

答案 1 :(得分:0)

如果您的代码最终在PasswordPolicyAwareContextSource.getContext中 或者在类似的弹簧代码中,Spring没有很好地处理它(bug) 帐户过期时会引发异常。上面的类捕获了这个异常 然后,这是关键,它叫做       PasswordPolicyResponseControl ctrl = PasswordPolicyControlExtractor.extractControl(ctx);
Spring然后调用ctrl.isLocked()但是没有检查任何其他条件。 你应该覆盖Spring的代码,你可以检查ctrl.isExpired(),ctrl.isChangeAfterReset(),那时还有一堆其他的信息getter