关于Spring:如何从 java 中针对 Active Directory 对用户进行身份验证?

How to authenticate user against Active Directory from java?

我需要从 java 中针对 Active Directory 对用户进行身份验证。为了了解幕后发生的事情,我从这里开始使用 openldap docker 实例和 spring 教程:
https://spring.io/guides/gs/authenticating-ldap/

我从许多调试会话中了解到,Spring 从 ldap 检索密码属性并将其与散列用户密码进行比较,或者它只是通过 uid 和散列密码过滤用户,如果有条目则密码正确。

好的,听起来不错。现在我正在尝试对 Active Directory 做同样的事情。问题是当我从中检索用户时,它给了我很多属性,但它没有给我任何看起来像散列密码的属性。所以也许 Active Directory 不允许获取密码属性,我应该按此属性过滤用户。但我不知道它的名字,也不知道从哪里得到它。

所以我的问题是:
1. 我理解的一切正确吗?
2. 我只需要通过 uid 和哈希密码过滤用户吗?
3.如果第二个是正确的,那么用户过滤的查询是什么?
4. 如果第二个不正确,那我理解错了什么?我应该如何从 java 中针对 Active Directory 对用户进行身份验证?


我将继续对 Active Directory 使用绑定身份验证方法。我过去使用过这种方法,对 Active Directory(或 ADAM)没有任何问题。对于绑定方案,您只需使用用户提供的用户名和密码,并允许 LDAP 实例执行比较(身份验证)。这是 Spring 文档的参考部分:

18.3.2 Using Bind Authentication

This is the most common LDAP authentication scenario.

This simple example would obtain the DN for the user by substituting the user login name in the supplied pattern and attempting to bind as that user with the login password. This is OK if all your users are stored under a single node in the directory. If instead you wished to configure an LDAP search filter to locate the user, you could use the following:

If used with the server definition above, this would perform a search under the DN ou=people,dc=springframework,dc=org using the value of the user-search-filter attribute as a filter. Again the user login name is substituted for the parameter in the filter name. If user-search-base isn't supplied, the search will be performed from the root.

您可能想通读有关 LDAP 身份验证的内容(Spring 3.x 文档中的第 18 章)。可能还有其他您觉得有用的信息。