Với cả người phát triển phần mềm và admin (quản trị), việc hiểu sự khác nhau giữa reference và referral là rất quan trọng. Hai khái niệm này đơi lúc gây bối rối, vì khái niệm “referral” đã lâu rồi ít được sử dụng. Như trong định nghĩa RFC 2251, một server LDAP trả về một reference khi
một yêu cầu tìm kiếm khơng thể được hồn tất mà khơng cĩ sự giúp đỡ của server thư muc khác. Tơi đã gọi reference đĩ là “subordinate knowledge reference” – tham chiếu kiến thức trực thuộc. Mặt khác, referral được nhắc tới khi server khơng thể thực hiện để hồn tất yêu cầu, thay vì chỉ khách hàng đến một thư mục khác nơi cĩ thể cĩ nhiều thơng tin hơn về việc tìm kiếm. Tơi đã gọi đĩ là “superior knowledge reference” vì nĩ chỉ khách hàng đến một server thư mục cĩ kiến thức cấp cao hơn, so với thư mục LDAP hiện tại.
Tìm kiếm Net::LDAP trả về một đối tượng Net::LDAP::Reference nếu việc tìm kiếm khơng thể hồn thành, nhưng cĩ thể được tiếp tục trên một server khác. Trong trường hợp này, reference
được trả về với các đơi tượng Net::LDAP::Entry. Nếu việc tìm kiếm địi hỏi một referral, nĩ
khơng trả về một đối tượng nội dung nào cả, mà là một đoạn mã LDAP_REFERRAL. Cả reference và referral được trả về trong dạng một LDAP URL. Để minh họa điều này, chúng ta sẽ chỉnh sửa đoạn mã gốc search.pl thành 2 dạng gián tiếp.
#!/usr/bin/perl
## Usage: ./fullsearch.pl name ##
## Author: Gerald Carter <jerry@plainjoe.org> ##
use Net::LDAP qw(LDAP_REFERRAL); use URI::ldap;
Đoạn mã kết nối với server thư mục:
$ldap = Net::LDAP->new ("ldap.plainjoe.org", port => 389,
version => 3 ) or die $!;
Để làm đơn giản ví dụ, ta sẽ xĩa hàm bind ( ) (từ phiên bản gốc của search.pl) và kết nối tới một thư mục nặc danh. Chúng ta cũng yêu cầu tất cả thuộc tính cho một nội dung (bao gồm cả cn và mail). Tham số callback là tham số mới). Giá trị của nĩ là tham chiếu tới các chương trình con cần chạy mỗi nội dung hoặc tham chiếu được trả bởi việc tìm kiếm:
$msg = $ldap->search( base => "ou=people,dc=plainjoe,dc=org", scope => "sub", filter => "(cn=$ARGV[0])", callback => \&ProcessSearch ); ProcessReferral( $msg->referrals( ) ) if $msg->code( ) = = LDAP_REFERRAL;
Đoạn code này làm 2 việc: nĩ đăng ký ProcessSearch( ) như là một callback thường lệ cho mỗi nội dung hoặc tham chiếu được trả về từ việc tìm kiếm; và gọi hàm ProcessReferral( ) nếu server trả lời với một referral.
Tất cả các callback thơng thường cĩ 2 thơng số: một là đối tượng Net::LDAP::Message và hai là đối tượng Net::LDAP::Entry. Hàm ProcessSearch( ) cĩ 2 nhiệm vụ: nĩ in nội dung của bất kỳ đối tượng Net::LDAP::Entry và đi theo đường dẫn LDAP URL trong trường hợp đĩ là đối tượng Net::LDAP::Reference (tham chiếu). Chương trình con ProcessSearch( ) bắt đầu bằng việc gán các giá trị cho $msg và $result. Nếu $result khơng cĩ (trong trường hợp tìm kiếm bị fail),
ProcessSearch( ) cĩ thể trả về mà khơng thực hiện bất cứ cơng việc gì. sub ProcessSearch {