使用自己的 ldif 文件时出现 LDAP 异常

Posted

技术标签:

【中文标题】使用自己的 ldif 文件时出现 LDAP 异常【英文标题】:LDAP exception when using own ldif file 【发布时间】:2021-09-01 14:02:02 【问题描述】:

昨天我问了一个问题,因为我试图访问一个 ldap 对象的 CN 属性。感谢jzheaux,我认为我现在走对了。但是我遇到了另一个问题。一旦我尝试将自己的 ldap 路径放入 ldif 文件中,就会出现以下异常:

原因:com.unboundid.ldap.sdk.LDAPException: DN 'dc=parascus,dc=de' 的条目已存在于服务器中。

我正在使用以下代码:

LdapTestApplication.java:

@SpringBootApplication
public class LdapTestApplication 
    public static void main(String[] args) 
        SpringApplication.run(LdapTestApplication.class, args);
    

HomeResource.java:

@RestController
public class HomeResource 
    @GetMapping("/")
    public String index(Authentication authentication, Principal principal) 
        // Access of CN property
        Person person = (Person) authentication.getPrincipal();
        String[] cn = person.getCn();
        return "Home page of " + cn[cn.length - 1] + " alias " + principal.getName();
//        return "home";
    

SpringSecurityConfig.java - 确定此人的部分来自 jzheaux(谢天谢地帮助我解决了我最初遇到的问题):

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
            .anyRequest().fullyAuthenticated()
            .and()
            .formLogin();
    

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.ldapAuthentication()
            .userDnPatterns("uid=0,ou=people")
            .groupSearchBase("ou=groups")
            .contextSource()
            .url("ldap://localhost:8389/dc=parascus,dc=de")
            .and()
            .passwordCompare()
            .passwordAttribute("userPassword");
    

    //
    // configuration for access of CN property
    // start
    //
    @Bean
    LdapAuthenticationProvider ldap(LdapAuthenticator authenticator) 
        LdapAuthenticationProvider ldap = new LdapAuthenticationProvider(authenticator);
        ldap.setUserDetailsContextMapper(new PersonContextMapper());
        return ldap;
    

    @Bean
    UnboundIdContainer ldapContainer() 
        UnboundIdContainer container = new UnboundIdContainer("dc=parascus,dc=de", "classpath:ldap-data.ldif");
        container.setPort(0);
        return container;
    

    @Bean
    ContextSource contextSource(UnboundIdContainer container) 
        int port = container.getPort();
        return new DefaultSpringSecurityContextSource("ldap://localhost:" + port + "/dc=parascus,dc=de");
    

    @Bean
    BindAuthenticator authenticator(BaseLdapPathContextSource contextSource) 
        BindAuthenticator authenticator = new BindAuthenticator(contextSource);
        authenticator.setUserDnPatterns(new String[]  "uid=0,ou=people" );
        return authenticator;
    
    //
    // configuration for access of CN property
    // end
    //

application.properties:

spring.ldap.embedded.port=8389
spring.ldap.embedded.ldif=classpath:ldap-data.ldif
spring.ldap.embedded.base-dn=dc=parascus,dc=de

ldap-data.ldif:

dn: dc=parascus,dc=de
objectclass: top
objectclass: domain
objectclass: extensibleObject
dc: parascus

dn: ou=groups,dc=parascus,dc=de
objectclass: top
objectclass: organizationalUnit
ou: groups

dn: ou=people,dc=parascus,dc=de
objectclass: top
objectclass: organizationalUnit
ou: people

dn: uid=jsmith,ou=people,dc=parascus,dc=de
objectclass: top
objectclass: person
objectclass: inetOrgPerson
cn: Smith, John
sn: Smith
uid: jsmith
userPassword: scrambled

dn: cn=developers,ou=groups,dc=parascus,dc=de
objectclass: top
objectclass: groupOfUniqueNames
cn: developers
ou: developer
uniqueMember: uid=jsmith,ou=people,dc=parascus,dc=de

当我删除获取 CN 信息的行时,我可以登录到页面并在浏览器中获取文本“主页”。我想我错过了一个小细节,或者我迷失在这个概念中......一切皆有可能。 我希望有人能给我一个提示是什么原因。

顺便说一句,当我删除 dc=parascus,dc=de 的部分时,希望它现在会添加一次此条目,我得到以下异常:

原因:com.unboundid.ldap.sdk.LDAPException: 无法添加条目 'ou=groups,dc=parascus,dc=de' 因为其父条目 'dc=parascus,dc=de' 不存在于服务器。

可能是我的程序尝试添加我的 ldif 文件两次,第二次检测到重复文件。但是我怎样才能告诉我的程序只添加一次呢?

亲切的问候

帕拉斯克斯

【问题讨论】:

错误表示条目dc=parascus,dc=de 已经存在,所以只需从 ldif 中删除它(第一个块)。 (从您的 ldif 文件中删除服务器上已经存在的所有条目) @EricLavault,感谢您的建议。这是我已经尝试过的结果,我得到了另一个异常:原因:com.unboundid.ldap.sdk.LDAPException:无法添加条目'ou = groups,dc = parascus,dc = de',因为它的父条目'dc =parascus,dc=de' 在服务器中不存在。因此,如果我给 dc=parascus,dc=de 它太多了,如果我删除它是不够的。必须有另一个原因,例如它通过 Spring Boot 泛型构建 ldap 树,然后尝试再次添加文件内容,但它已经存在。 好的,你应该更新你的帖子以反映这一点。 感谢您的提示,我已将此信息添加到我的问题中。 【参考方案1】:

好的,正如我在上面描述的那样,现在它正在工作。问题是我通过 application.configuration 文件构建了 LDAP 树。之后我的配置尝试构建一个新的 DefaultSpringSecurityContextSource ,它引用了同一个文件。所以它试图再次插入相同的条目,这导致了麻烦。

感谢您的努力。

【讨论】:

以上是关于使用自己的 ldif 文件时出现 LDAP 异常的主要内容,如果未能解决你的问题,请参考以下文章

java从ldap中导出数据到ldif文件中

带有 apacheds 的示例活动目录 ldif 文件

java导入ldif文件

LDAP-openldap服务部署和测试(YUM安装)

分配自定义字体时出现异常

使用 ldap 时出现 AcceptSecurityContext 错误