IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
메인 컨텐츠로 가기

한국 developerWorks  >  Tivoli | WebSphere  >

LDAP: Part 1: 설치 및 Java LDAP 프로그래밍

Lightweight Directory Access Protocol의 기초l

developerWorks
문서 옵션

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

샘플 코드


난이도 : 중급

Fred Simmons, 프로그래머, IBM
Jeng Yoong Tan, Consultant for Software Services for WebSphere, IBM

2005 년 4 월 07 일

LDAP(Lightweight Directory Access Protocol)에 대한 개요서이다.

머리말

다음 단계들을 따라가 보자.

  • Windows에 IBM Tivoli Directory Server를 설치 및 설정한다.
  • LDAP 브라우저와 명령행을 사용하여 트리에 LDAP 엔트리와 애트리뷰트를 추가, 수정, 삭제한다.
  • LDIF(Lightweight Data Interchange Format) 파일의 내용을 파악한다.
  • 간단한 자바 프로그램을 작성하여 LDAP 서버에 저장된 정보에 액세스 한다.



위로


LDAP의 기본 개념

LDAP는 비교적 정적인 정보들을 저장하는데 사용된다. "한번 쓰고 여러 번 읽기"라는 말이 LDAP의 사용법을 설명하기에 가장 적절한 말이다. LDAP는 검색용으로 최적화된 디렉토리로 만들어 진다. 트리 구조는 조직적인 구조를 개념화 하는데 유용하다.

LDAP 트리의 각 엔트리는 한 개 이상의 객체 클래스들로 구성된다. 모든 객체 클래스들은 이름 값 쌍에 저장된 애트리뷰트를 갖고 있다. LDAP 애트리뷰트 이름 값 쌍은 uid=c0001형태이다.

LDAP 스키마는,

  • LDAP 트리의 엔트리에 사용되는 객체 클래스와 이름들을 지정한다.
  • 각 애트리뷰트에서 지원되는 애트리뷰트 이름과 연산 유형을 지정한다.

LDAP 트리의 구조는 스키마에 기반한다.


그림 1. LDAP 트리의 일반적인 구조
The structure of an LDAP tree showing entries and attributes.

엔트리는 식별 이름 (dn)이나 상대적 식별 이름 (rdn)을 지정하여 LDAP에 배치된다. dn은 전체 LDAP 트리 경로인 반면 rdn은 트리의 특정 엔트리에 대한 고유 식별자이다.

dnrdn의 차이를 쉽게 이해하는 한 가지 방법은 방향과 주소의 차이를 생각해 보는 것이다. dn은 공항에서 호텔로 가는 방향에 해당한다. rdn은 그 호텔의 주소이다. 주소가 다 그렇듯이 rdn은 유일해야 한다. 주소가 유일하지 않다면 호텔을 찾기가 힘들지 않겠는가?




위로


LDAP에 저장된 사원 데이터

여러분의 프로젝트에는 LDAP 설정을 비교적 간단하게 했다. 사원 엔트리들을 일렬로 된 리스트로 나타낸다.

식별 이름(dn)에 uid애트리뷰트를 사용하여 사원의 식별 이름을 구현해 보자. 예를 들어, 매니저 Barbara Jensen의 dnuid=c0001,ou=people,dc=ibm,dc=com이다. uid의 값은 회사 유일한 ID이다. 이름 대신 회사 ID를 사용함으로서 LDAP를 쉽게 관리할 수 있다. 예를 들어, Barbara가 결혼을 하고 성을 Barbara Jensen-Howard로 바꾸면 두 개의 애트리뷰트만 바꾸면 된다. cn=Barbara Jensen-Howard, sn=Jensen-Howard 식별 이름에 cn=Barbara Jensen,ou=people,dc=ibm,dc=com을 사용했다면 전체 LDAP 엔트리를 삭제하고 cn=Barbara Jensen-Howard,ou=people,dc=ibm,dc=com을 다시 만들어야 했을 것이다. 같은 이름을 가진 두 명의 사원을 생각해 보자. 회사 ID를 사용함으로서 LDAP 트리에서 이름이 충돌하는 것을 막을 수 있다.

아래 표는 Billing Department의 사원 이름과 이에 상응하는 LDAP의 이름이다. 두 번째 칼럼은 사원들의 dn이다. 세 번째 칼럼에는 사원들의 rdn이 있다.

표 1. Employees distinguished and relative distinguished names in LDAP

사원명 LDAP의 식별 이름(dn) LDAP의 상대적 식별 이름(rdn)
Barbara Jensenuid=c0001,ou=people,dc=ibm,dc=comuid=c0001
Stu Pretzmanuid=c0002,ou=people,dc=ibm,dc=comuid=c0002
Varad Singhuid=c0003,ou=people,dc=ibm,dc=comuid=c0003
Steven Moyeruid=c0004,ou=people,dc=ibm,dc=comuid=c0004
Carla VanDykeuid=c0005,ou=people,dc=ibm,dc=comuid=c0005
Billy Parkeruid=c0006,ou=people,dc=ibm,dc=comuid=c0006

Barbara Jensen은 Billing Department의 매니저이다. 다른 다섯 개의 엔트리들은 그녀의 부하 직원들이다. LDAP의 각 엔트리에는 전화 번호, 주소, 이메일 등 유용한 사원 정보들이 포함되어 있다.

Billing Department의 사원 기록들을 LDAP 트리로 옮겨놓을 수 있다. 이 글을 읽어가면서 여러분은 이러한 사원 기록들에 대한 LDAP 엔트리를 추가, 수정, 삭제하게 될 것이다.




위로


IBM Tivoli Directory Server 설정

LDAP를 본격적으로 배우려면 컴퓨터에 LDAP 서버부터 설치하는 것이 좋다. 다음은 Windows에 IBM Tivoli Directory Server를 설치하는 방법이다.

IBM에서 Windows용 IBM Tivoli Directory Server를 다운로드 한다.

Zip 파일의 압축을 풀어 임시 디렉토리에 설치한다. ismp 폴더에서 setup.exe 아이콘을 더블클릭 하여 위자드를 시작한다. 설치 위자드 언어를 English로 선택한다. 라이센스 동의를 수락한다.


그림 2. Welcome Screen
Welcome to the InstallShield Wizard for IBM Tivoli Directory Server 5.2

언어는 English를 선택한다. 다음 패널에서 디렉토리 서버 컴포넌트의 설치용 프롬프트가 생긴다.


그림 3. 언어
Select the language for the IBM Tivoli Directory Server

DB2, GSKit 또는 WebSphere Application Server - Express 에디션을 이미 설치했다면, 위자드가 찾아낼 것이다. 하지만 DB2는 LDAP 서버와 같은 서버에 설치되어야 한다. 그렇지 않으면 이러한 컴포넌트를 설치해야 한다. Web Administration Tool과 IBM WebSphere Application Server – Express를 설치하라. 이러한 Next를 클릭한다.


그림 4. 기능
Select the features to install.

LDAP 서버 설치가 시작된다. 이 패널에 다다르면 컴퓨터 패널을 재 시작 할 때 까지 Next 버튼을 클릭한다.


그림 5. 추가 스크린
Read the information below.

두 번째 패널에서는 컴퓨터를 재시작 할 것인지 여부를 물을 것이다. Yes 라디오 버튼을 선택한다. Next를 클릭한다.


그림 6. 컴퓨터 재시작
Select the Yes radio button.

Finish 버튼을 누르면 컴퓨터는 재시작 한다.


그림 7. 컴퓨터 재시작
The wizard requires that you restart your computer.

컴퓨터가 재시작 되면 같은 사용자 ID로 로그인 해야 한다. IBM Tivoli Directory Server Configuration Tool이 자동으로 시작된다.


그림 8. Directory Server Configuration Tool
IBM Tivoli Directory Server Configuration Tool launched

Administrator DN/password 태스크를 클릭한다. 관리자 ID를 cn=root로 설정하고 패스워드를 ibm4root로 한다. OK 버튼을 누른다.


그림 9. 관리자 DN과 패스워드 변경하기
IBM Tivoli Directory Server Configuration Tool - Change administrator DN/password

관리자 ID cn=root는 마스터 LDAP 사용자 ID이고 LDAP 트리의 수정 같은 태스크에만 사용되어야 한다. LDAP 사용자에게 절대 주어서는 안된다.

Configure database 태스크를 선택한다. Create a new database를 선택한다. Next 버튼을 클릭한다. 데이터베이스의 사용자 ID와 패스워드를 입력한다. Next를 클릭한다. 데이터베이스 이름을 pcldap로 한다. 디폴트(UTF-8/UCS-2) 코드 설정이 선택되었는지를 확인한다. Next를 클릭한다. 드라이브 레터를 선택한다. Next 버튼을 누른 다음 Finish를 누른다. 데이터베이스 설치가 완료된 후에 Close 버튼을 누른다.


그림 10. 데이터베이스 설정
Configure LDAP database

태스크 바에서 Manage suffixes를 선택한다. dc=ibm, dc=com을 입력한다. 이것은 스키마의 접미사이다. Add 버튼을 누른다. dc=ibm,dc=com을 LDAP 그룹용 기본 접미사로 정한다. OK를 누르고 변경 사항을 저장한다. 이제 추가적인 기본 접미사들을 삽입할 수 있다.


그림 11. 접미사 관리
Manage LDAP suffixes

이 부분에서 LDAP에 사원 엔트리를 파퓰레이트 한다. Import LDIF data를 선택한다. LDIF (Lightweight Directory Interchange Format) 파일은 ASCII 파일 포맷으로서 LDAP 트리에 저장된 데이터를 로딩 및 저장하는데 사용된다. 실제 데이터 엔트리를 포함하고 있을 뿐만 아니라 LDIF 파일에는 스키마를 형성하는데 사용하는 객체들도 포함되어 있다.

setup.ldif 파일을 검색한다. Remove trailing spaces in Standard Import or Bulkload 체크 박스를 선택한다. 이것은 Standard import이다. Import 버튼을 클릭한다. 반입이 완료되면 Clear results를 누른다. 그리고 나서 Close 버튼을 누른다. LDAP 서버는 Directory Configuration Tool을 사용하여 LDIF 데이터를 반입하고 있는동안 실행될 수 없다.


그림 12. Import LDIF(Lightweight Directory Interchange Format) data
Import LDIF data

메뉴 바에서 File => Close를 선택하여 Directory Server Configuration Tool을 닫는다.




위로


LDAP 서버 시작

LDAP 서버를 시작하기 전에 서버에 정의된 IP 주소가 있어야 한다. 서버에 정적 IP 주소가 있다면 이 단계를 무시해도 좋다. 정적 IP 주소가 없다면 두 가지 옵션이 있다. 두 옵션 모두 서버 이름을 알아야 한다. 명령행에서 hostname을 입력한다. 첫 번째 옵션을 사용하려면 명령행 프롬프트를 시작하고 ipconfig를 입력한다.


그림 13. 명령어 프롬프트 - ipconfig 아웃풋
Enter ipconfig on the command line

<window os directory>\system32\drivers\etc\hosts 파일에 IP 주소를 입력한다. 서버를 재시작 한다. 이로서 LDAP 서버가 실행되고 다른 서버들이 여러분의 LDAP에 연결될 수 있다. 동적 IP 주소는 컴퓨터에 남아있다. 테스팅을 완료한 후에 호스트 파일에서 엔트리를 제거해야 한다. 로컬 개발에 LDAP 서버를 사용했다면 두 번째 옵션을 구현할 수 있다. 서버 이름의 별칭을 로컬 호스트 주소 127.0.0.1에 추가한다. <window os directory>\system32\drivers\etc\hosts파일에서 다음 엔트리를 추가한다. 이 로컬 호스트 별칭은 호스트 파일에 남아있게 된다.

# for LDAP TESTING
127.0.0.1<your server name goes here>

이 경고를 무시하면 바인드 에러로 고생하고 LDAP 서버는 절대로 시작되지 않는다.

<ldapinstalldir>\bin\ibmslapd.exe 명령어를 사용하여 명령행에서 LDAP 서버를 시작하거나 Services 패널을 사용할 수 있다. LDAP 서버는 IBM Tivoli Directory Server V5.2 엔트리이다. IBM Tivoli Directory Server Configuration Tool을 사용하여 설정을 변경할 경우 Directory Server를 중지해야 한다. Admin Daemon은 중지되어서는 안된다.


그림 14. Admin Daemon은 LDAP 관리를 위한 것이다. Directory Server는 LDAP 서버이다.
Services panel



위로


LDAP 트리 보기

Tivoli Directory Server는 WebSphere Express Server에서 실행될 수 있는 웹 클라이언트를 갖고 있다. 이 war 파일은 WebSphere 서버에도 설치될 수 있다. 더 나은 옵션은 Argonne National Laboratory에서 자바 LDAP 브라우저를 다운로드 하는 것이다.

설치 파일의 압축을 푼다. lbe.bat 명령어를 사용하여 에디터를 시작한다. New 버튼을 누른다. 이름을 IBM으로 한다.


그림 15. 새로운 LDAP 세션
Create the IBM session using the LDAP browser

Connection 탭을 누른다. LDAP 서버 호스트 이름을 입력한다. Base DNdc=ibm,dc=com이다. Anonymous 바인드를 선택 해제한다. Billing Department의 모든 멤버들이 LDAP 트리를 볼 수 있기 때문에 User DN에 Barbara Jensen의 uid=c0001,ou=people을 입력한다. append base DN 체크 박스를 선택한다. Barbara Jensen의 패스워드를 babs1me로 입력한다. Save 버튼을 누른다.

LDAP 브라우저를 사용하여 엔트리나 애트리뷰트를 추가, 수정, 삭제할 작정이라면 User DN을 cn=root로, 패스워드를 ibm4root로 변경한다. 또한 append base DN체크 박스를 해제한다. cn=root가 기본적인 식별 이름을 갖고있지 않기 때문이다.


그림 16. 연결 정보
Enter connection data

세션 리스트에서 IBM 세션을 선택하고 Connect 버튼을 누른다.


그림 17. 서버로 연결하기
Connect to server



위로


LDAP에서 엔트리와 애트리뷰트 조작하기

여러 가지 다양한 방법으로 LDAP 트리에서 엔트리를 추가, 수정, 검색, 삭제할 수 있다. LDAP 브라우저나 명령행 유틸리티를 사용할 수 있다.

브라우저 트리에서 엔트리를 선택하여 현재의 모든 애트리뷰트를 볼 수 있다. 커넥션 로그인에 cn=root를 사용하고 있다면 오른쪽 패인에서 애트리뷰트를 변경할 수 있다. 엔트리 역시 LDAP 브라우저를 사용하여 추가, 수정, 삭제될 수 있다. 매우 쉽다.


그림 18. 브라우저로 엔트리 조작하기
Using browser to manipulate LDAP entries and attributes



위로


명령행에서 엔트리 추가하기

IBM에서 Susan Baker라는 새로운 사원을 고용했다. 여러분은 LDAP 브라우저를 사용할 수 있지만 사원 엔트리에는 너무나 많은 애트리뷰트가 있다. ldapadd 명령어와 addemployee.ldif파일을 사용하여 사원을 추가할 수 있다. <ldapserver directory>\bin디렉토리에서, 명령행에 다음을 입력한다.

ldapadd -h ldap://<ldaphostname> -D "cn=root" -w ibm4root -f <ldif_directory_path>addemployee.ldif

Susan Baker 사원을 추가하는데 사용되는 LDIF 파일은 다음과 같다.



Listing 1. addemployee.ldif 파일

								
# this is a comment the # must be in FIRST column

version: 1

## ----------------------------------------------------------------------
## ePerson is an AUXILLIARY objectclass from IBM and must
## have a STRUCTURAL objectclass (inetOrgPerson in this case)
##
## this is an entry sequence and is preceded by a blank line

dn: uid=c0007,ou=people,dc=ibm,dc=com
objectclass: ePerson
objectclass: inetOrgPerson
cn: Susan Baker
sn: Baker
givenName: Susan
initials: SAB
title: Billing worker
uid: c0007
userpassword: hellome1
mail: sbaker@ibm.com
mail: susan.baker@ibm.com
homephone: +1 999 111 3425
telephoneNumber: +1 999 555 1262
facsimileTelephoneNumber: +1 999 555 1292
mobile: +1 999 555 141
roomNumber: 0220
carLicense: 6ABDE3
o: ibm
ou: Billing
departmentNumber: 2604
registeredAddress: 348 Parkside Dr Anywhere, IL 23480
postalAddress: 347 Parkside Dr. Anywhere, IL 23480
employeeNumber: 9899
employeeType: full time
preferredLanguage: en
labeledURI: http://www-1.ibm.com/servers/eserver/iseries/ldap/schema/
			


LDIF 파일을 로딩할 때 명령행을 사용하는 것과 Tivoli Directory Server Configuration Tool을 사용하는 것에는 여러 가지 이점이 있다. 명령행은 그래픽 유저 인터페이스보다 훨씬 빠르다. 또한 LDIF 파일을 로딩하기 위해 LDAP 서버를 중지시키지 않아도 된다. ldapadd를 실행한 후에 업데이트를 보려면 LDAP 브라우저에서 디렉토리 트리를 리프레시 해야 한다. dc=ibm,dc=com엔트리를 선택하고 Refresh 아이콘을 누른다.




위로


명령행에서 엔트리 보기

ldapsearch를 사용하여 업데이트 내용을 본다. 명령행에서 다음을 입력한다.

ldapsearch -h ldap://<ldaphostname> -D "cn=root" -w ibm4root -b "ou=people,dc=ibm,dc=com" "uid=c0007"

–b는 트리 검색을 시작할 장소를 가리킨다. ou=people,dc=ibm,dc=com에 Susan Baker용 엔트리를 추가했기 때문에 트리의 이 레벨에서 검색을 시작한다. 또한 Susan의 기록에 대한 전체 트리 dc=ibm,dc=com을 검색하려면 다음을 사용한다.

ldapsearch -h ldap://<ldaphostname> -D "cn=root" -w ibm4root -b "dc=ibm,dc=com" "uid=c0007"




위로


명령행에서 엔트리 삭제하기

사원 Billy Parker는 정적 IP 주소가 없는 서버에 the IBM Tivoli Directory Server를 설치하느라 여러 날을 보냈고 그의 호스트 파일을 업데이트 하지 못했다. 그의 매니저인 Barbara는 그의 무능력 때문에 해고했다. ldapdelete 명령어를 사용하여 회사 LDAP에서 그를 제거한다.

ldapdelete -h ldap://<ldaphostname> -D "cn=root" -w ibm4root "uid=c0006,ou=people,dc=ibm,dc=com"




위로


명령행에서 엔트리 수정하기

Billing Department의 매니저 Barbara Jensen은 새로운 집으로 이사하고 전화번호도 +1 999 222 3423으로 바꾼다. 또한 직장에도 또 따른 회선 +1 999 243 2312를 추가하고 회사 웹 사이트에 그녀의 사진도 올려놓는다. 다음 라인을 사용하여 그녀의 기록을 업데이트 한다.

ldapadd -h ldap://<ldaphostname> -D "cn=root" -w ibm4root -f <ldif_directory_path>modifyemployee.ldif

Barbara Jensen의 엔트리를 수정하는 LDIF 파일은 아래와 같다. 파일에 있는 는 여러 애트리뷰트의 업데이트를 허용한다.


Listing 2. modifyemployee.ldif 파일

					
				
# this is a comment the # must be in first column 
version: 1


## ----------------------------------------------------------------------------
## ePerson is an AUXILLIARY objectclass from IBM and must
## have a STRUCTURAL objectclass (inetOrgPerson in this case)
## - Modify the Barbara Jensen entry setup in setup.ldif.
#
# Change her telephones and add a jpg.
#
## this is an entry sequence and is preceded by a blank line

dn: uid=c0001,ou=people,dc=ibm,dc=com
changetype: modify
add: telephonenumber +1 999 243 2312
telephonenumber: +1 999 243 2312
-
replace: homephone
homephone: +1 999 222 3423
-
add: jpegphoto
jpegphoto: http://www.ibm.com/photo/babs.jpg

				





위로


명령행 연산 포맷

LDAP 명령어의 일반적인 포맷을 아래 표에 정리해 놓았다.

표 2. LDAP 명령행 연산

연산 포맷
추가 또는 수정ldapadd -h ldap://<ldaphostname> -D <root DN> -w <root password> -f <ldif_file_path>
검색ldapsearch -h ldap://<ldaphostname> -D <root DN> -w <root password> -b <base search DN> <search DN>
삭제ldapdelete -h ldap://<ldaphostname> -D <root DN> -w <root password> <DN to be deleted>



위로


인터넷 익스플로러에서 LDAP 데이터 디스플레이 하기

인터넷 익스플로러와 관련된 재미있는 특징인 LDAP 서버와 연결된 Address Book이다. 인터넷 익스플로러를 시작하고 다음 URL을 주소 바에 입력한다.

ldap://<ldaphostname>/ou=people,dc=ibm,dc=com??one?(objectclass=*)

인터넷 익스플로러의 Address Book 프로그램이 시작되면 여러분의 주소록에 있는 사원들을 볼 수 있다.


그림 19. 인터넷 익스플로러 주소록
Launch Internet Explorer to view address book entries



위로


LDIF 파일 포맷 개요

Lightweight Data Interchange Format(LDIF)는 LDAP 엔트리들을 간단한 텍스트 포맷으로 표현한다. 이 섹션에서는 LDIF 엔트리 포맷에 대해 설명하겠다.

엔트리의 기본 폼은 아래와 같다. 엔트리 시퀀스는 공백으로 시작한다. 주석은 첫 번째 칼럼에서 #로 표시된다. “ : ” 다음에는 공백을 둔다.

# comment line
dn: <distinguished name>
<attrdesc>: <attrvalue>
<attrdesc>: <attrvalue>
<attrdesc>: <attrvalue>
...

Susan Baker의 addemployee.ldif 파일을 보자.


Listing 3. addemployee.ldif 파일

								
# this is a comment the # must be in FIRST column

version: 1

## ----------------------------------------------------------------------
## ePerson is an AUXILLIARY objectclass from IBM and must
## have a STRUCTURAL objectclass (inetOrgPerson in this case)
##
## this is an entry sequence and is preceded by a blank line

dn: uid=c0007,ou=people,dc=ibm,dc=com
objectclass: ePerson
objectclass: inetOrgPerson
cn: Susan Baker
sn: Baker
givenName: Susan
initials: SAB
title: Billing worker
uid: c0007
userpassword: hellome1
mail: sbaker@ibm.com
mail: susan.baker@ibm.com
homephone: +1 999 111 3425
telephoneNumber: +1 999 555 1262
facsimileTelephoneNumber: +1 999 555 1292
mobile: +1 999 555 141
roomNumber: 0220
carLicense: 6ABDE3
o: ibm
ou: Billing
departmentNumber: 2604
registeredAddress: 348 Parkside Dr Anywhere, IL 23480
postalAddress: 347 Parkside Dr. Anywhere, IL 23480
employeeNumber: 9899
employeeType: full time
preferredLanguage: en
labeledURI: http://www-1.ibm.com/servers/eserver/iseries/ldap/schema/
			


# 문자로 시작되는 라인은 주석이다. 여러 # 문자가 가능하지만 뒤에는 반드시 공백이 있어야 한다. 버전 숫자로는 파일의 변경 사항들을 계속 추적할 수 있다. 이 엔트리 시퀀스의 첫 줄은 식별 이름(dn)이다. uid 애트리뷰트는 이 엔트리를 트리에 배치하는데 사용되는 열쇠이다. 따라서 상대적 식별 이름(rdn)은 uid=c0007이다. Susan Baker의 엔트리는 인력 구성 단위(ou) 밑에 있다. 인력 조직 단위는 기본 dc=ibm,dc=com 엔트리 밑에 위치한다.

다음 두 줄은 Susan Baker의 정보를 포함하고 있는 엔트리용 객체 클래스를 정의한다. 기본 LDAP 스키마는 한 사람에 대한 정보를 저장하는 inetOrgPerson 객체를 제공한다. 하지만 오늘날의 비즈니스 환경에 필요한 많은 애트리뷰트들이 부족하다. 예를 들어, inetOrgPerson에는 핸드폰 애트리뷰트가 없다. IBM Tivoli Directory Server는 보조 클래스인 ePerson을 두어서 여기에 mobilepostalAddress 같은 유용한 애트리뷰트를 담도록 했다. IBM이 제공하는 모든 스키마 리스트는 Tivoli 스키마 리파지토리에서 다운로드 할 수 있다.

LDIF 파일의 나머지 부분에는 Susan Baker에 대한 다양한 인적 애트리뷰트가 포함된다.




위로


자바를 사용하는 LDAP 데이터

자바는 LDAP에 저장된 데이터에 액세스 하는데 훌륭한 프레임웍을 제공한다. 프로시저는 다른 유형의 액세스와 비슷하다. LDAP 서버로 연결한다. 읽기, 쓰기, 삭제하기 같은 연산을 수행한다. 연결을 끊는다.

LDAP에 연결하기

Java Naming and Directory Interface(JNDI)는 LDAP 서버에 액세스 하는데 사용된다. DirContext 객체는 자바 프로그램이 LDAP에 첨부되도록 하는 도관이다. 이 DirContext 사용법은 간단하다. LDAP 서버, 루트 사용자 이름과 패스워드, 여러 자바 아이템(컨텍스트 팩토리, 보안 원리와 참조)의 URL과 함께 Properties 객체를 만든다. Properties 객체는 DirContext의 생성자로 전달된다.

아래 코드표는 TestLDAP.java 프로그램의 소스 코드를 참조했다.


							
//--------------------------------------------------
// Set up the environment for creating the initial context
//--------------------------------------------------
Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");

props.setProperty(Context.PROVIDER_URL, "ldap://<lpadserver>:389");
props.setProperty(Context.URL_PKG_PREFIXES, "com.sun.jndi.url");

props.setProperty(Context.REFERRAL, "ignore");
props.setProperty(Context.SECURITY_AUTHENTICATION, "simple");

// --------------------------------------------------
//specify the root username
// --------------------------------------------------
props.setProperty(Context.SECURITY_PRINCIPAL, "cn=root");

//--------------------------------------------------
//specify the root password
// --------------------------------------------------
props.setProperty(Context.SECURITY_CREDENTIALS, "ibm4root");

//--------------------------------------------------
// Get the environment properties (props) for creating initial
// context and specifying LDAP service provider parameters.
//--------------------------------------------------
DirContext ctx = new InitialDirContext(props);

LDAP 검색

LDAP 서버로 연결이 되면 매칭 엔트리나 애트리뷰트를 위해 트리를 검색할 수 있다.

우선, 검색의 제약조건을 설정해야 한다. TestLDAP.java 프로그램에서, 제약조건들은 모두 SUBTREE_SCOPE으로 설정된다.

							
SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

아래 표는 setSearchScope()에서 지원되는 모든 매개변수들이다.

표 3. setSearchScope() 매개변수

setSearchScope() 작동
SUBTREE_SCOPE 기본 엔트리에서 시작하여 기본 엔트리 및 이 밑에 있는 모든 것을 검색한다. 이것은 가장 느리고 가장 비싼 검색이다.
ONELEVEL_SCOPE 기본 엔트리 밑에 있는 엔트리들을 검색한다.
OBJECT_SCOPE 기본 엔트리만 검색한다. 가장 빠르고 저렴한 검색이다.

다음 단계는 검색 결과로 채워질 엔터티 애트리뷰트를 설정하는 것이다. 모든 재미있는 엔터티들이 ePerson 스키마에 속해있기 때문에 리턴된 애트리뷰트 필드는 모든 가능한 ePerson 애트리뷰트의 어레이로 설정된다.

							
constraints.setReturningAttributes(EPERSON_ATTRIBUTE_LIST);

다음은 검색이다. BASE_SEARCH 정의는 ou=people,dc=ibm,dc=com로 설정된다. 이것은 사원 트리의 부모이다. 다른 검색 필터 포맷 역시 이 소스에서 지정된다.

				
NamingEnumeration results = ctx.search(BASE_SEARCH, filter, constraints);

검색 필터는 다음 포맷 중 한 가지를 취한다.

표 4. 검색 필터

심볼 필터 예제 매치
~= Approximate sn~=Jensen Jensen에 있는 어떤 변수도 허용.
= Equality sn=Jensen Jensen이라는 성. 가장 일반적인 검색 포맷이다.
> Greater Than sn>Jensen A알파벳 순서로, Jensen 다음의 성. (예, Pretzman)
>= Greater Than or Equal sn>=Jensen 알파벳 순서로, Jensen에 매치되거나 Jensen 다음에 나오는 성.
< Less Than sn<Jensen Jensen 이전의 성. (예를 들어, Baker)
<= Less Than or Equal sn<=Jensen Jensen 또는 그 앞에 나오는 성.
=* Presence of Attribute sn=* sn 애트리뷰트를 포함하는 모든 엔트리.
* Wildcard String Match sn=Jen*n Jensen과 매치되는 스트링, 서브스트링, 수퍼스트링.
& And (&(sn=Jensen) (initials=BJJ)) 모든 조건과 매치되는 엔트리. 이 경우 BJJ 이니셜과 Jensen의 성.
| Or (|(sn=Jensen) (initials=BJJ)) 두 조건 중 하나를 만족시키는 엔트리. Jensen의 성 또는 BJJ의 이니셜.
! Not (sn=Jensen) 괄호 안 조건의 반대. Jensen을 제외한 모든 성.

검색이 끝난 후에 프로그램은 컨텍스트에서 리턴된 NamingEnumeration을 사용하여 결과 설정을 반복한다. 각 애트리뷰트가 프린트 된다.

		
if (results.hasMoreElements()) 
{
		System.out.println(" has returned results..\n");
		bFoundIt = true;
		// Since UID is unique across the entire directory,
		// the search results should contain only one entry.
		SearchResult sr = (SearchResult) results.next();
		// --------------------------------------------------------
		// Get all available attribute types and their associated
		// values and print them out.
		// --------------------------------------------------------
		printAttributes(sr.getAttributes());
} 
else 
{
		System.out.println(" has returned no results..");
}

애트리뷰트 업데이트 하기

엔트리의 애트리뷰트를 업데이트 하는 코드는 검색 코드와 비슷하다. 먼저, 프로그램은 검색과 같은 방법으로 업데이트 될 엔트리를 찾는다. 이 부분에서 엔트리용 애트리뷰트가 수정, 추가, 삭제된다. ModificationItem 객체는 BasicAttribute 객체가 표현한 애트리뷰트를 바꾸는데 사용된다.

		
// Get all available attribute types and their associated
// values.
Attributes attributes = sr.getAttributes();

// Specify the changes to make
ModificationItem[] mods = new ModificationItem[1];

// -------------------------------------------
// remove the attribute
// -------------------------------------------
if (bRemoveAttribute) {
	// eliminate the attribute
	if (null != attributes.get(attrName)) {
	         mods[0] = new ModificationItem(
				DirContext.REMOVE_ATTRIBUTE,
				new BasicAttribute(attrName, attrVal));
	}
}
// -------------------------------------------
// replace or add the attribute
// -------------------------------------------
else {
	// do a replace of the attribute
	if (null != attributes.get(attrName)) {
		mods[0] = new ModificationItem(
			DirContext.REPLACE_ATTRIBUTE,
				new BasicAttribute(attrName, attrVal));
	}
	// add the attribute
            else {
		mods[0] = new ModificationItem(
			DirContext.ADD_ATTRIBUTE, new BasicAttribute(
						attrName, attrVal));
	}
}

ctx.modifyAttributes(updateDN + "," + BASE_SEARCH, mods);

연결 종료

LDAP 서버 작동을 완료한 후에 연결을 종료해야 한다. finally 블록에 close 호출을 하면 LDAP 연결이 종료된다.

	
//always close the directory context when you are done
finally {
		try {
			if (null != ctx)
				ctx.close();
		} catch (Exception e2) {
		}
}

샘플 프로그램 실행

LDAP 샘플 프로그램을 실행하려면 명령행에 java -jar createLDAP.jar를 입력한다.




위로


결론

어느 정도 LDAP에 대한 지식이 쌓였을 것이라 생각된다. 식별 이름과 상대적 식별 이름의 개념을 이해하고 IBM Tivoli Directory Server의 설치 단계도 배웠다. LDAP Browser와 명령행을 사용하여 LDAP 엔트리를 추가, 수정, 삭제할 수 있게 되었다. LDIF 파일의 포맷도 이해했으리라 믿는다. 마지막으로 JNDI를 사용하여 LDAP 서버에 액세스 하는 방법도 배웠다.





위로


다운로드 하십시오

설명이름크기다운로드 방식
This contains LDIF files and the createLDAP.jart-createLDAP.zip16KB  FTP|HTTP|Download Director
다운로드 방식에 대한 정보Get Adobe® Reader®



위로


참고자료




위로


필자소개

Fred Simmons, 프로그래머, IBM


Jeng Yoong Tan, Consultant for Software Services for WebSphere, IBM





위로


기사에 대한 평가

매우 불만족 (1)
불만족 (2)
보통 (3)
만족 (4)
매우 만족 (5)




위로



    IBM 소개개인정보 보호정책문의