1

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

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

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

我得到的只是一个 detailMessage,我假设它是 AD 发回的。就像是:

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

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

有人遇到过这个问题吗?

非常感谢!

4

2 回答 2

4

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

现在,773似乎特定于 Active Directory。因此,如果需要,这需要由用户明确处理。 此链接列出了一堆 Active Directory 错误。Spring ldap 将在其错误详细信息中提供此文本,让用户根据需要使用它们。

于 2010-12-15T05:38:48.000 回答
0

如果您的代码以 PasswordPolicyAwareContextSource.getContext 或类似的 spring 代码结尾,则 Spring 不能很好地处理它(错误)。
当帐户过期时,将引发异常。上面的类捕获了这个异常,然后,这是关键,它调用
PasswordPolicyResponseControl ctrl = PasswordPolicyControlExtractor.extractControl(ctx);
Spring 然后调用 ctrl.isLocked() 但无法检查任何其他条件。您应该覆盖 Spring 的代码,并且您可以检查 ctrl.isExpired()、ctrl.isChangeAfterReset() 和一堆其他可用的信息获取器

于 2012-11-12T09:01:21.610 回答