본문 바로가기
Backend/Java

[Java api] Active Directory와 연결방법 (LDAP)

by 마진 2022. 5. 1.

 

Active Directory란?

 사용자 정보를 저장하고 관리하는 데이터베이스의 한 유형으로 디렉토리 서비스의 한 유형이다. 친숙한 관계형 데이터베이스(MySQL, OracleDB 등)와 다르게 AD(Active Directory)는 도메인 네임 시스템(DNS)을 기반으로한 디렉토리 구조로 데이터를 저장/관리한다.
* 이름을 기준으로 데이터에 손쉽게 접근할 수 있다.

 

 

example) 저장되는 데이터의 name 예시 - 아래처럼 entry를 ,로 나열한 형태이다.

 

 CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=COM 

('Fabrikam company 세일즈 팀 Jeff Smith'의 식별이름)

 

 

 

 

 

 

데이터 접근방식 - LDAP

 AD의 데이터에 접근하기 위해서는 LDAP 프로토콜을 사용한다.

LDAP는 디렉토리 서비스에 접근하여 데이터를 저장하고 수정할 수 있는 통신 프로토콜을 의미한다. 

 

 

관계형 데이터베이스와 디렉토리 서비스를 간단히 비교한다면 아래와 같다.

 

  MySQL Active Directory(AD)
데이터베이스 유형 RDBMS Directory Service
프로토콜 database access protocol LDAP
Connection API JDBC LdapContext

 

 

 

LDAP 스키마 (LDAP Object)

 LDAP 프로토콜을 사용해 조회할 수 있는 대상의 속성(객체)정보를 가지고 있는 것을 LDAP 스키마라고 부른다. 대상의 식별이름(DN)과 관련있으며 다양한 속성을 가지고 있다. 대상의 속성정보와 객체클래스 정보를 사용하여 조회할 속성과 검색 조건을 설정할 수 있다.

 

ex) cn(공통이름), objectGUID(전역식별자 - 중복되지 않는다.), etc

 

 

 

 

간단한 조회 프로세스

1. DN으로 조회 대상 기준 선택 

2. 필터링할 클래스정보 설정

3. 검색할 속성 및 범위 설정

 

 

 

 

API 코드 구현

 

public class LdapProtocolManager {

    public List<Map<String, String>> read() throws NamingException {
        List<Map<String, String>> result = new ArrayList<Map<String, String>>();

        // set up environment
        Hashtable<String, String> env = new Hashtable<>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        env.put(Context.PROVIDER_URL, "ldap://localhost:389");

        // authentication
        env.put(Context.SECURITY_AUTHENTICATION, "simple");
        env.put(Context.SECURITY_PRINCIPAL, "id");
        env.put(Context.SECURITY_CREDENTIALS, "password");

        // create initial context
        LdapContext context = new InitialLdapContext(env, null);

        // set up search condition
        String searchName = "OU=ldap,DC=java,DC=margin,DC=com";
        String searchFilter = "(objectClass = * )"; // 모든 개체 검색
        String[] returningAttributes = {"objectGUID", "cn"};

        SearchControls sc = new SearchControls();
        sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
        sc.setReturningAttributes(returningAttributes);

        NamingEnumeration<SearchResult> searchResults = context.search(searchName, searchFilter, sc);

        // see search results
        while (searchResults.hasMoreElements()) {
            SearchResult sr = searchResults.nextElement();
            Attributes attr = sr.getAttributes();

            String objectGUID = attr.get("objectGUID").get().toString();
            String cn = attr.get("cn").get().toString();

            Map<String, String> map = new HashMap<>();
            map.put("objectGUID", objectGUID);
            map.put("cn", cn);

            result.add(map);
        }


        context.close();

        return result;
    }

}

 

 

코드 예시

https://github.com/JaewookMun/java-api/tree/main/src/com/margin/java/ldap

 

 

 

 

참고