如果在配置 spring 引导时未提供 DC,如何为 ldif 文件定义 DN

how to define DN for ldif file if DC is not provided while configuring with spring boot

我正在使用带 spring 引导的嵌入式 ldap 服务器来测试我的 ldif 文件及其凭据,但我发现我的 ldif 文件格式与普通 ldif 有点不同,因为 dc 未被私有化,仅在 dn 内部 o已给出。

我已经为上述 ldif 格式尝试了不同的配置,但它仍然显示 Bad Credentials 屏幕,但它与其他 ldif 文件一起工作正常。

ldif 文件

# id=00000001
dn: o=COMPANY
objectClass: organization
structuralObjectClass: organization
o: COMPANY
entryCSN: 20130409162114.626166Z#000000#000#000000
entryUUID: 3e7f8668-357d-1032-8a6b-c5bcf7f703f0
creatorsName: cn=Manager,o=COMPANY
createTimestamp: 20130409162114Z
modifiersName: cn=Manager,o=COMPANY
modifyTimestamp: 20130409162114Z
contextCSN: 20130702105648.506150Z#000000#000#000000
contextCSN: 20191018052018.692119Z#000000#001#000000
contextCSN: 20191018044350.858888Z#000000#002#000000
contextCSN: 20191018053729.621549Z#000000#003#000000

# id=00000002
dn: ou=department,o=COMPANY
objectClass: organizationalUnit
structuralObjectClass: organizationalUnit
ou: department
entryCSN: 20130409162455.623488Z#000000#000#000000
entryUUID: c2390a06-357d-1032-8a6c-c5bcf7f703f0
creatorsName: cn=Manager,o=COMPANY
createTimestamp: 20130409162455Z
modifiersName: cn=Manager,o=COMPANY
modifyTimestamp: 20130409162455Z

网络安全配置

@Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .ldapAuthentication()
                .userDnPatterns("uid={0},ou=department")
                .contextSource()
                    .url("ldap://localhost:8389/o=COMPANY")
                    .and()
                .passwordCompare()
                    .passwordEncoder(new LdapShaPasswordEncoder())
                    .passwordAttribute("userPassword");
}

application.properties

spring.ldap.embedded.base-dn= o=COMPANY
spring.ldap.embedded.ldif=classpath:ldap-server-2.ldif
spring.ldap.embedded.port= 8389
spring.ldap.embedded.validation.enabled=false

在使用上述所有详细信息进行配置后,应用程序执行良好并且我得到了身份验证屏幕,但是在正确的凭据之后出现了事件,我得到了错误的凭据屏幕。 我不知道怎么了,是 ldif 的 dn 名称还是什么?

请提出您宝贵的建议。提前致谢!

o=COMPANY 作为根条目而不是使用 DC 本身不是问题。

您的 ldif 似乎是正确的,但此处显示的内容不包含任何用户条目(仅 id=00000001id=00000002)。

因此,根据 userDnPatterns("uid={0},ou=department"),用户条目应包含在 ou=department 中,因此在您的 ldif 文件中定义 after,例如。 :

# id=00000003
dn: uid=test,ou=department,o=COMPANY
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
uid: test
mail: test@domain.com
cn: Firstname Lastname
givenName: Firstname
sn: Lastname

此外,大多数服务器不接受匿名绑定,身份验证请求本身可能需要绑定到服务器才能搜索给定条目并测试其凭据,只需添加 managerDn()managerPassword() 在 WebSecurityConfig 的 configure 方法中:

.contextSource()
  .url('ldap://localhost:8389/o=COMPANY')
  .managerDn('admin')
  .managerPassword('password')
  .and()
...

您还可以在 application.properties 中设置这些 ContextSource 参数:

spring.ldap.embedded.credential.username= uid=admin
spring.ldap.embedded.credential.password= password