如何让Spring Security ActiveDirectoryLdapAuthenticationProvider工作?

j0pj023g  于 2023-11-19  发布在  Spring
关注(0)|答案(1)|浏览(126)

在Sping Boot 应用程序中,我想对Active Directory执行身份验证。作为预先信息,以下的Webldapsearch正在工作并按预期提供信息:

ldapsearch -D "cn=boss,ou=admin,dc=example,dc=com" -w pw1234 -h ldap.example.com -p 389 -b "ou=students,dc=example,dc=com" "[email protected]"

字符串
因此,在yaml-configuration中,我设置了ldap上下文源,如下所示:

spring.ldap.base: "dc=example,dc=com"
spring.ldap.urls: "ldap://ldap.example.com:389"
spring.ldap.username: "cn=boss"
spring.ldap.password: "pw1234"


此设置适用于使用Spring的BindAuthenticator的本地OpenDJ安装,但现在我正在尝试对真实的世界Active Directory进行身份验证。为此,我设置了ActiveDirectoryLdapAuthenticationProvider

@Bean
public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {

    ActiveDirectoryLdapAuthenticationProvider provider =
            new ActiveDirectoryLdapAuthenticationProvider("", "ldap://ldap.example.com:389");

    // provider.setSearchFilter("(uid={0})"); // do I need this?

    return provider;
}


不幸的是,我得到的是以下错误:

ActiveDirectoryLdapAuthenticationProvider:  Authentication for [email protected] failed:javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C090439, comment: AcceptSecurityContext error, data 52e, v4563 ]
ActiveDirectoryLdapAuthenticationProvider:  Active Directory authentication failed: Supplied password was invalid


我没有得到任何进一步的信息,比如与manager-dn(cn=boss)的初始绑定是否成功,但我假设,还有更多的东西要配置,我只是不知道。也许我必须在某个地方显式地设置manager-dnmanager-password,但如果是这样,在哪里?
有人知道从哪里开始解决这个问题吗?

编辑:

按照要求,这里是ldapsearch的最重要的结果:

dn:: Q049MmFiZWUgc3R1ZGVudCA0MiAzNDQyMDEwMTk2LE9VPXN0dWRlbnRzLERDPWV4YW1wbGUsREM9Y29t
cn: 2abee student 42 3442010196
description: 3442010196
displayName: 42 student (2abee)
distinguishedName:: Q049MmFiZWUgc3R1ZGVudCA0MiAzNDQyMDEwMTk2LE9VPXN0dWRlbnRzLERDPWV4YW1wbGUsREM9Y29t
generationQualifier: 3442010196
givenName: 42
mail: [email protected]
memberOf:: Q049MmFiZWUsT1U9c3R1ZGVudHMsREM9ZXhhbXBsZSxEQz1jb20=
name: 2abee student 42 3442010196
sn: student
sAMAccountName: [email protected]
userPrincipalName: [email protected]

登录表单中输入的凭据为:
username: [[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)password: secret

xggvc2p6

xggvc2p61#

cn属性存在于Active Directory中,但您需要将可分辨名称(dn)放入配置中,与您在ldapsearch命令行中使用的名称相同。

spring.ldap.base: "dc=example,dc=com"
spring.ldap.urls: "ldap://ldap.example.com:389"
spring.ldap.username: "cn=boss,ou=admin,dc=example,dc=com"
spring.ldap.password: "pw1234"

字符串
现在ActiveDirectoryLdapAuthenticationProvider类中的默认搜索是(&(objectClass=user)(userPrincipalName={0}))。这意味着用户需要输入他们的userPrincipalName属性的值。将其更改为(uid={0})(与setSeachFilter)将不起作用,保留默认值。
你得到的异常在第229行抛出。阅读代码,看起来像这样:

  1. doAuthentication接收用户名和密码
  2. bindAsUser不会搜索,但会尝试使用提供的用户名和密码登录。
    1.它无法登录,因此引发异常。您确定您的密码正确吗?
    换句话说,代码的行为如下:
ldapsearch -D "[email protected]" -w secret -h ldap.example.com -p 389 -b "ou=students,dc=example,dc=com" "[email protected]"


代码中没有使用spring.ldap.usernamespring.ldap.password。您可以删除它们,您将得到相同的错误。
Simple bind over a non-encrypted connection is often blocked,但它看起来对你有用。你还是应该使用LDAPS.

相关问题