1. 개요

LDAP 디렉토리 서버는 읽기 최적화 된 계층 적 데이터 저장소입니다. 일반적으로 사용자 인증 및 권한 부여에 필요한 사용자 관련 정보를 저장하는 데 사용됩니다.

이 기사에서는 사용자를 인증 및 검색하고 디렉토리 서버에서 사용자를 만들고 수정하는 Spring LDAP API를 살펴 봅니다. LDAP에서 다른 유형의 항목을 관리하는 데 동일한 API 세트를 사용할 수 있습니다.

2. Maven 의존성

필요한 Maven 의존성을 추가하여 시작하겠습니다.

<dependency>
    <groupId>org.springframework.ldap</groupId>
    <artifactId>spring-ldap-core</artifactId>
    <version>2.3.1.RELEASE</version>
</dependency>

이 의존성의 최신 버전은 spring-ldap-core 에서 찾을 수 있습니다 .

3. 데이터 준비

이 기사의 목적을 위해 먼저 다음 LDAP 항목을 생성 해 보겠습니다.

ou=users,dc=example,dc=com (objectClass=organizationalUnit)

이 노드에서 새 사용자를 만들고, 기존 사용자를 수정하고, 기존 사용자를 인증하고, 정보를 검색합니다.

4. 스프링 LDAP API

4.1. ContextSourceLdapTemplate Bean 정의

ContextSourceLdapTemplate 을 만드는 데 사용됩니다 . 다음 섹션에서 사용자 인증 중 ContextSource 사용을 살펴 보겠습니다.

@Bean
public LdapContextSource contextSource() {
    LdapContextSource contextSource = new LdapContextSource();
    
    contextSource.setUrl(env.getRequiredProperty("ldap.url"));
    contextSource.setBase(
      env.getRequiredProperty("ldap.partitionSuffix"));
    contextSource.setUserDn(
      env.getRequiredProperty("ldap.principal"));
    contextSource.setPassword(
      env.getRequiredProperty("ldap.password"));
    
    return contextSource;
}

LdapTemplate 은 LDAP 항목의 생성 및 수정에 사용됩니다.

@Bean
public LdapTemplate ldapTemplate() {
    return new LdapTemplate(contextSource());
}

4.2. 사용자 인증

이제 기존 사용자를 인증하는 간단한 논리를 구현해 보겠습니다.

public void authenticate(String username, String password) {
    contextSource
      .getContext(
        "cn=" + 
         username + 
         ",ou=users," + 
         env.getRequiredProperty("ldap.partitionSuffix"), password);
}

4.3. 사용자 생성

다음으로 새 사용자를 만들고 LDAP에 암호의 SHA 해시를 저장해 보겠습니다.

인증시 LDAP 서버는 제공된 비밀번호의 SHA 해시를 생성하고 저장된 비밀번호와 비교합니다.

public void create(String username, String password) {
    Name dn = LdapNameBuilder
      .newInstance()
      .add("ou", "users")
      .add("cn", username)
      .build();
    DirContextAdapter context = new DirContextAdapter(dn);

    context.setAttributeValues(
      "objectclass", 
      new String[] 
        { "top", 
          "person", 
          "organizationalPerson", 
          "inetOrgPerson" });
    context.setAttributeValue("cn", username);
    context.setAttributeValue("sn", username);
    context.setAttributeValue
      ("userPassword", digestSHA(password));

    ldapTemplate.bind(context);
}

digestSHA () 는 제공된 암호의 SHA 해시의 Base64 인코딩 문자열을 반환하는 사용자 지정 메서드입니다.

마지막으로 LdapTemplatebind () 메서드 는 LDAP 서버에 항목을 만드는 데 사용됩니다.

4.4. 사용자 수정

다음 방법으로 기존 사용자 또는 항목을 수정할 수 있습니다.

public void modify(String username, String password) {
    Name dn = LdapNameBuilder.newInstance()
      .add("ou", "users")
      .add("cn", username)
      .build();
    DirContextOperations context 
      = ldapTemplate.lookupContext(dn);

    context.setAttributeValues
      ("objectclass", 
          new String[] 
            { "top", 
              "person", 
              "organizationalPerson", 
              "inetOrgPerson" });
    context.setAttributeValue("cn", username);
    context.setAttributeValue("sn", username);
    context.setAttributeValue("userPassword", 
      digestSHA(password));

    ldapTemplate.modifyAttributes(context);
}

lookupContext () 메소드는 제공된 사용자를 찾기 위해 사용된다.

4.5. 사용자 검색

검색 필터를 사용하여 기존 사용자를 검색 할 수 있습니다.

public List<String> search(String username) {
    return ldapTemplate
      .search(
        "ou=users", 
        "cn=" + username, 
        (AttributesMapper<String>) attrs -> (String) attrs.get("cn").get());
}

AttributesMapper가 있는 항목에서 원하는 속성 값을 가져 오는 데 사용됩니다. 내부적으로 Spring LdapTemplate발견 된 모든 항목에 대해 AttributesMapper호출 하고 속성 값 List을 생성합니다.

5. 테스트

spring-ldap-test 는 ApacheDS 1.5.5를 기반으로하는 임베디드 LDAP 서버를 제공합니다. 테스트를 위해 임베디드 LDAP 서버를 설정하려면 다음 Spring Bean을 구성해야합니다.

@Bean
public TestContextSourceFactoryBean testContextSource() {
    TestContextSourceFactoryBean contextSource 
      = new TestContextSourceFactoryBean();
    
    contextSource.setDefaultPartitionName(
      env.getRequiredProperty("ldap.partition"));
    contextSource.setDefaultPartitionSuffix(
      env.getRequiredProperty("ldap.partitionSuffix"));
    contextSource.setPrincipal(
      env.getRequiredProperty("ldap.principal"));
    contextSource.setPassword(
      env.getRequiredProperty("ldap.password"));
    contextSource.setLdifFile(
      resourceLoader.getResource(
        env.getRequiredProperty("ldap.ldiffile")));
    contextSource.setPort(
      Integer.valueOf(
        env.getRequiredProperty("ldap.port")));
    return contextSource;
}

JUnit으로 사용자 검색 방법을 테스트 해 보겠습니다.

@Test
public void 
  givenLdapClient_whenCorrectSearchFilter_thenEntriesReturned() {
    List<String> users = ldapClient
      .search(SEARCH_STRING);
 
    assertThat(users, Matchers.containsInAnyOrder(USER2, USER3));
}

6. 결론

이 기사에서는 Spring LDAP API를 소개하고 LDAP 서버에서 사용자 인증, 사용자 검색, 사용자 생성 및 수정을위한 간단한 방법을 개발했습니다.

항상 그렇듯이이 Github 프로젝트 에서 전체 소스 코드를 사용할 수 있습니다 . 테스트는 Maven 프로필 "live"아래에 생성되므로 "-P live"옵션을 사용하여 실행할 수 있습니다.