H. Giới thiệu LDAP và JNDI
II. CĂN BẢN VỀ JNDI
1. Những điều cần chuẩn bị
Trước khi chúng ta bắt đầu, chúng ta cần làm 2 việc. Đầu tiên, hãy chắc chắn rằng chúng ta có đầy đủ các phần mềm yêu cầu. Mục đầu tiên của phần này sẽ liệt kê các phần mềm đó.
Kế đến, chúng ta cần thực thi một vài thiết đặt cho việc lập trình. Mục cuối của phần này sẽ hướng dẫn chi tiết để làm điều này, gồm cả cách để tạo một initial context và cách để điều khiển các biệt lệ mà các phương thức JNDI có thể ném ra.
Hơn nữa, một phần được đưa vào để giải thích những gì mong đợi từ các ví dụ trong tài liệu này. Các ví dụ đều có khuynh hướng hướng dẫn chúng ta theo dõi khi xây dựng cách ứng dụng của chính chúng ta. Chúng ta có thể chạy chúng để quan sát hành vi được mô tả.
Khi chúng ta viết các ứng dụng cho chính chúng ta và chạy chúng chống lại các máy chủ mà
Giới Thiệu LDAP chúng ta hoặc những người khác có thể thiết lập, hành vi mà chúng ta quan sát có thể khác biệt một cách đột ngột.
1.1 Phần mềm được yêu cầu
Dưới đây là danh sách các phần mềm/hệ thống chúng ta cần có:
Phần mềm cho hệ nền Java
Phần mềm cung cấp dịch vụ
Phần mềm máy chủ đặt tên và thư mục 1.1.1 Phần mềm cho hệ nền Java
Để chạy các ứng dụng độc lập (application) hoặc các ứng dụng ký sinh (applet) có sử dụng JNDI, chúng ta cần có một phiên bản phần mềm cho hệ nền Java v1.1.2 hoặc cao hơn (chẳng hạn như phần mềm Java 2 Software Development Kit – SDK).
Để chạy các applet, chúng ta có thể sử dụng bất kỳ trình duyệt Web nào hiểu Java, như trình duyệt HotJava (http://java.sun.com/products/HotJava), Netscape Communicator hoặc Navigator v4 (http://www.netscape.com/download/), hoặc Internet Explorer v5 (http://www.microsoft.com/ie/). Để đảm bảo rằng các applet của chúng ta có đầy đủ các chức năng mới nhất của phần mềm hệ nền Java, chúng ta có thể dùng Java Plug-in (http://java.sun.com/products/plugin/) với trình duyệt Web của chúng ta.
1.1.2 Phần mềm JNDI
Các thư viện lớp JNDI đã có sẵn trong Java 2 SDK, v1.3. Nếu đang sử dụng một phiên bản khác của SDK, thì chúng ta có thể sử dụng phần mềm JNDI có thể lấy về từ Website JNDI (http://java.sun.com/products/jndi).
1.1.3 Phần mềm cung cấp dịch vụ
JNDI API là một API thông dụng cho việc truy xuất bất kỳ một dịch vụ đặt tên hay thư mục nào. Thực sự truy xuất vào một dịch vụ đặt tên hay thư mục được kích hoạt kín đáo trọng một bộ cung cấp dịch vụ dựa trên JNDI. Một giới thiệu về kiến trúc JNDI và vai trò của các bộ cung cấp dịch vụ được đề cập trong phần Tổng quan về JNDI.
Một service provider (bộ cung cấp dịch vụ) là một phần mềm ánh xạ JNDI API thực sự hướng tới máy chủ đặt tên hoặc thư mục. Cơ bản, những vai trò của bộ cung cấp dịch vụ này và máy chủ đặt tên/thư mục là khác nhau. Trong thuật ngữ của phần mềm client/server, JNDI và bộ cung cấp dịch vụ là client (gọi là JNDI client) và máy chủ đặt tên/thư mục là server.
Các máy chủ và máy khách tương tác với nhau bằng nhiều cách. Theo cách thông thường, chúng sử dụng một giao thức mạng để phía client và server có thể tồn tại một cách riêng biệt trong một môi trường mạng. Cơ bản, máy chủ hỗ trợ nhiều máy khách khác nhau, không chỉ các JNDI client, mà nó còn cho các máy khách thích ứng với giao thức được chỉ định. JNDI không ra lệnh cho bất kỳ kiểu sự tương tác đặc biệt nào giữa các JNDI client và các server. Ví dụ, ở một mức độ nào đó client và server có thể cùng tồn tại.
Chúng ta cần lấy các lớp cho các bộ cung cấp dịch vụ mà chúng ta đang sử dụng. Ví dụ, nếu chúng ta có kế hoạch sử dụng JNDI để truy xuất vào một máy chủ LDAP, thì chúng ta sẽ cần phần mềm cho một bộ cung cấp dịch vụ LDAP.
đó của SDK, thì chúng ta cần lấy về các bộ cung cấp dịch vụ. Website JNDI (http://www.java.sun.com/products/jndi/serviceproviders.html) liệt kê các bộ cung cấp dịch vụ mà chúng ta có thể tải về, bao gồm luôn các bộ cung cấp dịch vụ cho LDAP.
Trong phần này có 2 bộ cung cấp dịch vụ:
Bộ cung cấp dịch vụ hệ thống tập tin cho các ví dụ về đặt tên
Bộ cung cấp dịch vụ LDAP cho các ví dụ về thư mục và thông báo sự kiện Bộ cung cấp dịch vụ hệ thống tập tin có thể lấy về từ Website JNDI
(http://www.java.sun.com/products/jndi/serviceproviders.html).
Khi đang sử dụng bộ cung cấp dịch vụ hệ thống tập tin, chúng ta không cần phải thiết lập một máy chủ bởi vì chúng ta có thể sử dụng hệ thống tập tin cục bộ như là máy chủ. Khi đang sử dụng bộ cung cấp dịch vụ LDAP, lúc đó chúng ta cần phải thiết lập máy chủ của riêng chúng ta hoặc có thể truy xuất đến một máy chủ có sẵn, được giải thích ở phần tiếp theo.
1.1.4 Phần mềm máy chủ đặt tên và thư mục
Đầu tiên chúng ta có thể lấy về các phần mềm cung cấp dịch vụ, kế đến chúng ta cần thiết đặt hoặc có thể truy xuất đến một máy chủ đặt tên/thư mục tương ứng. Việc thiết lập một máy chủ đặt tên/thư mục là công việc hết sức đơn giản của một nhà quản trị hệ thống mạng.
Các nhà cung cấp khác có các thủ tục cài đặt khác nhau cho các máy chủ đặt tên/ thư mục của họ. Một vài yêu cầu đặc biệt của bộ máy đặc quyền trước khi máy chủ có thể được cài đặt.
Chúng ta nên tham khảo những sự chỉ dẫn cài đặt của phần mềm hệ thống đặt tên/thư mục.
Đối với các ví dụ về naming trong phần này, chúng ta sẽ sử dụng hệ thống tập tin.
Đối với các ví dụ về directory trong phần này, chúng ta cần phải truy xuất vào một máy chủ LDAP. Chúng ta có thể sử dụng bất kỳ máy chủ LDAP nào tùy ý. Máy chủ thư mục Sun ONE có thể chạy trên rất nhiều nền, bao gồm cả Windows, có thể tải về từ:
http://wwws.sun.com/software/products/directory_srvr/home_directory.html. Chúng ta cũng có thể tải về một máy chủ miễn phí LDAP từ http://www.openldap.org/. Xem phần tiếp theo để biết thêm thông tin về sự phổ biến của máy chủ LDAP với nội dung thông qua các ví dụ.
Các máy chủ công cộng có thể truy xuất vào từ các URL sau:
ldap://ldap.Bigfoot.com
ldap://ldap.four11.com
ldap://ldap.InfoSpace.com
1.2 Các nội dung của Thư mục
Đầu tiên chúng ta thiết lập thư mục, hoặc có một chương trình chỉ dẫn để giao tiếp với một thư mục hiện tại, chúng ta có thể mong đợi tìm thấy được điều gì từ việc sắp xếp thông tin? Chúng ta có thể lấy 2 loại thông tin từ thư mục: các kết nối và các thuộc tính.
Thư mục có thể được xem như bao gồm các kết nối tên-đến-đối tượng. Đó là, mỗi đối tượng trong thư mục có mọt tên tương ứng. Chúng ta có thể lấy một đối tượng trong thư mục bằng việc tra cứu tên của nó. Nếu chúng ta đang sử dụng một dịch vụ đặt tên như là hệ thống tập tin chẳng hạn, thì các đối tượng là các tập tin và chúng được kết nối đến các tên tập tin.
Cũng như thế, được lưu trữ trong thư mục là các thuộc tính. Một đối tượng trong thư mục, bổ sung cho một cái tên, cũng có một tùy chọn tập hợp các thuộc tính. Chúng ta có thể
Giới Thiệu LDAP yêu cầu thư mục đối với các thuộc tính của một đối tượng, như khi yêu cầu nó cho việc tìm kiếm một đối tượng mà có chứa các thuộc tính.
Phần này đưa ra một số ví dụng về việc truy xuất cả 2 loại thông tin. Những chỉ định chính xác những gì chúng ta có thể truy xuất từ một dịch vụ đặt tên hoặc thư mục dựa trên cách dịch vụ riêng biệt đã được bố trí và thông tin nào đã được thêm vào nó.
1.2.1 Directory Schema
Một schema chỉ định các kiểu của các đối tượng mà một thư mục có thể chứa. Một số phần tử yêu cầu những định nghĩa schema đặc biệt. Để cung cấp các phần tử này, đầu tiên chúng ta phải tắt việc kiểm tra schema trên server cũng như thêm các tập tin schema vào server. Cả 2 nhiệm vụ này cơ bản được thư thi bởi người quản trị máy chủ thư mục.
Phần này giới thiệu 2 tập tin schema cần phải được cài đặt:
Schema cho các đối tượng Java
Schema cho các đối tượng CORBA
Định dạng của các tập tin này là theo một nghi thức mô tả mà có lẽ không thể trực tiếp sao chép và dán vào trong các tập tin cấu hình server. Cụ thể hơn là các cú pháp của thuộc tính đều được mô tả trong các khoản RFC 2252.
Các máy chủ thư mục khác nhau đều có các cách khác nhau về việc cấu hình schema của chúng. Trong phần này chứa một vài công cụ cho việc cài đặt các schema của Java và CORBA trên các máy chủ thư mục mà cho phép các schema của chúng được xây dựng lại thông qua LDAP. Nó cũng bao gồm các công cụ cho việc cập nhật một thư mục đã có mà nó có các phiên bản cũ hơn so với các schema này. Dưới đây là một danh sách các nhiệm vụ mà các công cụ có thể thực thi.
Tạo Java Schema
Tạo CORBA Schema
Cập nhật các phần tử thư mục có sử dụng một Java schema lỗi thời
Cập nhật các phần tử thư mục có sử dụng một CORBA schema lỗi thời
Những sự chỉ dẫn dưới đây trong việc cung cấp tập tin README để chạy những chương trình này.
Lưu ý 1: Nếu chúng ta đang sử dụng Máy chủ thư mục Netscape 4.1 (http://www.netscape.com/), thì chúng ta phải cập nhật schema.
Nếu chúng ta đang cập nhật schema bằng việc cập nhật các tập tin cấu hình của nó theo tùy chọn, thì đầu tiên định vị tập tin java-object-schema.conf trong quá trình máy chủ ở thư mục có tên là
NETSCAPE-DIRECTORY-HOME/slapd-SERVER- ID/config/
Những nội dung của java-object-schema.conf bị lỗi thời. Chúng ta phải thay thế chúng với các nội dung của schema được cập nhật. Xem Lưu ý 2 cho những chỉ dẫn bổ sung.
Nếu chúng ta đang cập nhật schema bằng cách sử dụng các chương trình Java cung cấp tron phần này, thì điều đầu tiên là địn vị tập tin ns-schema.conf trong quá trình cài đặt
NETSCAPE-DIRECTORY-HOME/slapd-SERVER- ID/config/
Chú thích ngoài lề chứa java-object-schema.conf bởi vì schema đó là lỗi thời. Khởi động lại máy chủ và sử dụng chương trình CreateJavaSchema để cài đặt schema cập nhật.
Chúng ta cần tùy chọn xóa tham chiếu tới schema cũ từ danh sách các schema đính kém trong ns-schema.conf. Do bởi máy chủ không cho phép nhiều schema đính kèm được xây dựng thông qua LDAP.
Lưu ý 2: Máy chủ thư mục Netscape 4.1 có một cách khác để định danh cho các cú pháp của thuộc tính hơn RFC 2250. Đối với máy chủ đó, chúng ta nên sử dụng những chỉ dẫn dưới đây:
o ―case ignore string‖ cho các thuộc tính với cú pháp Directory String (1.3.6.1.4.1.1466.115.121.1.15)
o ―binary‖ cho thuộc tính với cú pháp Octet String (1.3.6.1.4.1.1466.115.121.1.40)
Lưu ý 3: Windows Active Directory. Active Directory quản lý schema của nó bằng việc sử dụng một định dạng bên trong (internal). Để cập nhật schema, chúng ta có thể sử dụng Console snap-in trong bộ Active Directory Management, ADSIEdit, hoặc tiện ích CreateJavaSchema, những chỉ dẫn bên dưới dành cho Active Directory.
1.2.2 Cung cấp Nội dung thư mục
Để thiết lập namespace hệ thống tập tin, chạy chương trình Setup (Setup.java).
Chương trình này tạo một nhánh tập tin cung cấp một khung tham chiếu thông dụng để thảo luận về những gì mong muốn trong các khoản của danh sách và tra cứu đối tượng từ hệ thống tập tin. Để chạy chương trình này, chỉ cần cung cấp cho nó một cái tên của thư mục dùng để tạo namspace kiểm tra thử. Ví dụ, gõ:
# java Setup /tmp/tutorial
Tạo một thư mục /tmp/tutorial và gắn kết nó nó với các thư mục và tập tin.
Trong các ví dụ về thư mục, kết quả hiển thị phản ánh cách thư mục LDAP được thiết lập sử dụng tập tin cấu hình (tutorial.ldif) được cung cấp kèm theo đĩa. Nếu chúng ta đang sử dụng một máy chủ có sẵn, hoặc một máy chủ với một thiếp lập khác, thì chúng ta có thể sẽ thấy kết quả khác. Trước khi chúng ta có thể nạp tập tin cấu hình (tutorial.ldif) vào máy chủ thư mục, chúng ta phải theo những sự chỉ dẫn dưới đây để cập nhật schema cho máy chủ.
Lưu ý cài đặt: Điều khiển truy xuất. Các máy chủ thư mục khác nhau giám sát truy xuất điều khiển rất khác nhau. Một số ví dụ trong phần này thực thi việc cập nhật đến thư mục có thể bị giới hạn cho việc truy xuất đối với nơi chúng ta đã cài đặt vào namespace. Do đó, chúng ta cần có được quyền truy trên máy chủ để làm cho thư mục có thể đọc và/hoặc cập nhật để các code trong tài liệu này có thể làm việc. Đối với máy chủ thư mục SunONE và Netscape, bổ sung phần tử aci được đề nghị trong tập tin netscape.aci.ldif cho phần tử dn: o=JNDITutorial để làm cho phần tử thư mục có thể đọc và cập nhật được. Nói khác hơn, chúng ta có thể sửa đổi các ví dụ để chúng xác thực thư mục. Chi tiết về cách để làm điều này được mô tả trong phần Sự bảo mật.
Lưu ý cài đặt: Thiếp lập Namespace. Các phần tử trong tutorial.ldif sử dụng distinguished name (DN) ―o=JNDITutorial‖ cho root naming context. Nếu chúng ta chưa cấu hình máy chủ thư mục để có ―o=JNDITutorial‖ như là một root naming context, thì sự
Giới Thiệu LDAP cố gắng của chúng ta để nạp tutorial.ldif sẽ thất bại. Các dễ nhất để giải quyết vấn đề này là bổ sung DN của một root naming context đã có và mỗi dòng ―dn:‖ trong tập tin tutorial.ldif. Ví dụ, nếu máy chủ của chúng ta đã có root naming context là
―dc=agu,,dc=edu,dc=vn‖, thì chúng ta nên thay đổi dòng này:
dn: o=JNDITutorial to
dn: o=JNDITutorial, dc=agu, dc=edu, dc=vn
Hãy làm như thế đối với những dòng bắt đầu với ―dn:‖ bên trong tập tin. Kế đến, trong tất cả các ví dụ trong tài liệu này, nơi nào sử dụng ―o=JNDITutorial‖, sẽ thay bằng
―o=JNDITutorial,dc=agu,dc=edu,dc=vn‖.
Lưu ý cài đặt: Định dạng tập tin. Dựa trên nền tảng của hệ điều hành mà chúng ta đang sử dụng, chúng ta có thể cần chỉnh sử tutorial.ldif để nó chứa những ký tự sang dòng mới (newline character) thích hợp với hệ nền. Ví dụ, nếu chúng ta tìm trong tutorial.ldif có chứa các ký tự sang dòng mới (CRLF) theo kiểu cách của Windows và chúng ta đang nạp tập tin này vào một máy chủ thư mục đang chạy dưới nền Linux, thì chúng ta cần chỉnh sửa tập tin và thay thế CRLF thành LF. Một dấu hiệu để nhận biết vấn đề này là máy chủ thư mục đó từ chối tất cả các phần tử trong tutorial.ldif.
Lưu ý cài đặt: Windows Active Directory.
o Root naming directory không phải là ―o=jnditutorial‖. Nó sẽ có dạng là
―dc=x,dc=y,dc=z‖. Chúng ta cần xem phần Lưu ý cài đặt Thiết lập Namespace ở trên.
o Thêm các lớp đối tượng và các thuộc tính liên quan cho các lớp đối tượng
―inetOrgPerson‖ và ―groupOfUniqueNames‖ vào schema của Active Directory bằng việc dùng Active Directory Management Console snap-in, ADSIEdit.
―groupOfUniqueNames‖ được định nghĩa trong RFC 2256, ―inetOrgPerson‖ trong RFC 2798.
o Mặc định một số quan hệ phân cấp được sử dụng trong tài liệu này không được Active Directory cho phép. Để kích hoạt các quan hệ này, bổ sung chúng bằng cách sử dụng Active Directory Management Console snap-in, ADSIEdit.
objectclass: organizationalUnit possible superiors: domainDNS inetOrgPerson organizaton
organizationalPerson organizationalUnit person
top
objectclass: groupOfUniqueNames possible superiors: top
possible superiors: container
organizationalPerson person
top
o Xóa một trong 2 thuộc tính ―sn‖ từ phần tử Mark Twain trong tutorial.ldif. Active Directory định nghĩa ―sn‖ cho thuộc tính có giá trị đơn, trái ngược với RFC 2256.
o Sử dụng tiện tích ldifde từ dòng lệnh để nạp tập tin tutorial.ldif đã chỉnh sửa.
o # ldifde -i -v -f tutorial.ldif
o Hầu hết các ví dụ giả định rằng thư mục đã được thiết lập để cho phép truy xuất đọc và cập nhật đều chưa được xác thực. Active Directory của chúng ta thiết lập có thể cho cho phép chúng ta làm điều đó. Xem phần Lưu ý cài đặt Điều khiển truy xuất.
o Đôi khi việc đọc một phần tử kết xuất nhiều thuộc tính được đưa ra trong tài liệu này bởi vì Active Directory thường trả về một vài thuộc tính bên trong.
o Việc tạo các phần tử có thể đòi hỏi đặc tả bổ sung của Active Directory để chỉ định các thuộc tính hoặc sử dụ cho các lớp đối tượng khác.
1.3 Các gói và Classpath
Để sử dụng JNDI trong chương trình của chúng ta, chúng ta cần thiết lập các môi trường cho sự thiết lập và thực thi của nó.
1.3.1 Nạp vào các lớp JNDI Nạp vào các gói dưới đây:
javax.naming
javax.naming.directory
javax.naming.event
javax.naming.ldap
javax.naming.spi
Các ví dụ trong tài liệu này sử dụng các lớp và giao diện từ 2 gói đầu tiên. Chúng ta cần nạp 2 gói này vào trong chương trình của chúng ta hoặc chỉ nạp các lớp và giao diện cần thiết sử dụng. Hai dòng lệnh bên dưới nạp vào tất cả các lớp và giao diện từ 2 gói javax.naming và javax..naming.directory.
import javax.naming.*;
import javax.naming.directory.*;
1.3.2 Môi trường biên dịch
Để biên dịch một chương trình có sử dụng JNDI, chúng ta cần truy xuất các lớp JNDI.
Java 2 SDK, v1.3 đã tích hợp sẵn các lớp JNDI, vì thế néu chúng ta đang sử dụng nó thì chúng ta không cần làm gì thêm nữa.