java

Java Active Directory 조회

안녕하세요. 이번에 제가 맡은 프로젝트에 Active Directory 인증이 포함되어
테스트 모듈로 접속이 되는지 확인을 했습니다.
아래 접속 코드 입니다.

   1: public static void main(String[] args) throws NamingException, IOException {
   2:        
   3:         Hashtable ldapEnv = new Hashtable(); 
   4:         String ldapHost = "google.com"; // 
   5:         String domain = "google.com"; // 
   6:         String port = "389"; // default Port
   7:         String urlDC = "ldap://" + ldapHost+":"+port+"/"; // ldap://google.com:389/
   8:         String dcList = "";
   9:         dcList = "DC=" + domain.replaceAll("\\.", ",DC="); // DC=google, DC=com
  10:  
  11:         String ldapUser = "coozplz";
  12:         String ldapPass = "blogspot";
  13:         String userName = ldapUser + "@" + domain; // coozplz@google.com
  14:         
  15:         
  16:         /*
  17:          * 환경 설정을 입력한다.
  18:          */
  19:         ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
  20:         ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
  21:         ldapEnv.put(Context.SECURITY_PRINCIPAL, userName);        // coozplz@google.com
  22:         ldapEnv.put(Context.SECURITY_CREDENTIALS, ldapPass);      // blogspot
  23:         ldapEnv.put(Context.PROVIDER_URL, urlDC);                 // ldap://google.com:389/
  24:         ldapEnv.put("com.sun.jndi.ldap.read.timeout", "2000");    // Read Timeout 설정
  25:         ldapEnv.put( "com.sun.jndi.ldap.connect.timeout", "2000");// Connect Timeout 설정
  26:         
  27:         
  28:         String objAttribs[] = {"displayName"}; // 조회할 칼럼명을 배열에 입력
  29:         
  30:         LdapContext ctx = null;
  31:         try {
  32:             ctx = new InitialLdapContext(ldapEnv, null);
  33:         } catch (Exception e) {
  34:             System.out.println("LDAP 접속에 실패 했습니다.");
  35:         } 
  36:         int pageSize = 1000;
  37:         
  38:         ctx.setRequestControls(new Control[] {new PagedResultsControl(pageSize, true)});
  39:         SearchControls srchInfo = new SearchControls();
  40:     
  41:         srchInfo.setSearchScope(SearchControls.SUBTREE_SCOPE);
  42:         
  43:         srchInfo.setReturningAttributes(objAttribs);
  44:         
  45:         dcList = "CN="+ldapUser+",OU=members,OU=nex1,DC=lignex1,DC=com";
  46:         NamingEnumeration dirObjects = ctx.search(dcList,"(objectClass=user)", srchInfo);
  47:         while (dirObjects != null && dirObjects.hasMoreElements()) {
  48:             SearchResult dirObject = (SearchResult) dirObjects.next();
  49:             System.out.println(dirObject.getName() +"\t" + dirObject.getAttributes().get("pwdLastSet"));
  50:             ctx.close();
  51:         }
  52:     }

모듈을 만들었는데 제대로 동작하는지 확인을 해야 합니다. 일단 자신이 조회할 칼럼이 뭔지를 알아야 합니다. Active Directory 구조를 잘 아는 사람이면 모르겠지만
그렇지 않은 경우에는 어떤 칼럼이 어디에 속해 있는지 확인을 해야 합니다. 테스트 모듈 실행을 디버깅 모드로 해서 조회된 데이터를 모두 확인해보면 되겠지만
굉장히 힘든 작업입니다. 그래서 Active Directory Explorer 를 검색했습니다. MS Technet에서 무료로 제공하는 툴이 있습니다.
Active Directory Explorer 다운로드 바로가기

다운받아 접속을 합니다.
접속에 성공하면  Active Directory 를 탐험 할 수 있습니다. 필요한 칼럼이 있는 곳으로 찾아갑니다.
찾아가면 아래 그림에 보이는 것처럼 Path 경로를 확인 할 수 있습니다. Path 경로를 45번 라인에
입력
하고 28번 라인에 칼럼명을 입력하면 됩니다.

위의 소스를 실행하면 System.out.println(dirObject.getName() +”\t” + dirObject.getAttributes().get(“pwdLastSet”))라인에 출력되는 결과는 “pwdLastSet: XXXXXXXXXXXXXX” 이렇게 출력이 됩니다. split(“ “) 을 사용해서 구분을 해서 사용하면 됩니다.

기본

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중