my ( $page, $ctrl, $cookie, $i );
Lớp kiểm sốt trang kết quả (Paged Results control) yêu cầu một thơng số duy nhất: là số nội dung lớn nhất cĩ thể trình bày trong 1 trang. Trong ví dụ này, bạn sẽ set số này là 4.
$page = Net::LDAP::Control::Paged->new( size => 4 );
Để xác minh rằng việc tìm kiếm được hồn thành trong các trang, ta sẽ thêm một hàm đếm và in giá trị của nĩ tại cuối mỗi lần lặp. Vịng lặp sẽ chạy cho tới khi tất cả các nội dung đều được trả lại từ server, khơng thì sẽ cĩ lỗi.
$i = 1; while (1) {
Sau khi đối tượng Net::LDAP::Control::Paged được khởi tạo, nĩ phải được bao gồm trong lệnh
search( ). Thơng số control chấp nhận một mảng của đối tượng kiểm sốt để áp dụng cho yêu
cầu. $msg = $ldap->search( base => $dn, scope => "sub", filter => "(cn=$ARGV[0])", callback => \&ProcessSearch, control => [ $page ] );
Việc sử dụng kiểm sốt LDAP trong việc tìm kiếm khơng ảnh hướng đến các mã trả về tìm kiếm, do đĩ vẫn cần thiết xử lý các referrals hoặc lỗi giao thức:
## Check for a referral.
}
## Any other errors? elsif ($msg->code( )) { $msg->error( ); last;
}
Cuối cùng, bạn cần cĩ các cookie được trả về từ server. Giá trị này phải được bao gồm trong yêu cầu tìm kiếm tiếp theo để server biết được khách hàng muốn tiếp tục từ vị trí nào trong danh sách nội dung.
## Handle the next set of paged entries.
( $ctrl ) = $msg->control( LDAP_CONTROL_PAGED ) or last;
$cookie = $ctrl->cookie( ) or last;
$page->cookie( $cookie );
Tại cuối vịng lặp, in số trang.
print "Paged Set [$i]\n"; $i++;
}} }
Đầu ra:
$ ./pagedsearch.pl '*' | egrep '(dn|Paged)' dn:CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Gerald W. Carter,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=TelnetClients,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Administrator,CN=Users,DC=ad,DC=plainjoe,DC=org Paged Set [1] dn:CN=Guest,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=TsInternetUser,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=krbtgt,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Domain Computers,CN=Users,DC=ad,DC=plainjoe,DC=org Paged Set [2] dn:CN=Domain Controllers,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Schema Admins,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Enterprise Admins,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Cert Publishers,CN=Users,DC=ad,DC=plainjoe,DC=org Paged Set [3] dn:CN=Domain Admins,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Domain Users,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=Domain Guests,CN=Users,DC=ad,DC=plainjoe,DC=org
dn:CN=Group Policy Creator Owners,CN=Users,DC=ad,DC=plainjoe,DC=org Paged Set [4]
dn:CN=RAS and IAS Servers,CN=Users,DC=ad,DC=plainjoe,DC=org dn:CN=DnsAdmins,CN=Users,DC=ad,DC=plainjoe,DC=org
dn:CN=DnsUpdateProxy,CN=Users,DC=ad,DC=plainjoe,DC=org
Cĩ thể trong tương lai, cần thiết phải thực hiện các kiểm soats mới. Các hàm khởi tạo một đối tượng Net::LDAP::Control cĩ thể cĩ 3 thơng số:
type
Chuỗi ký tự đại diện OID. critical
Nếu thơng số này khơng được xác định, nĩ giả sử là FASLE, và server sẽ được tự do xử lý các yêu cầu mặc dù việc kiếm sốt khơng thực hiện.
value
Thơng tin tùy chọn được yêu cầu bởi việc kiểm sốt. Đinh dạng của giá trị thơng số này là duy nhất cho mỗi kiểm sốt và được định nghĩa bởi các nhà thiết kế kiểm sốt. Cĩ thể khơng cĩ thơng tin thêm nào được yêu cầu bởi việc kiểm sốt..
Việc sử dụng phổ biến nhất của đối tượng Net::LDAP::Control là xĩa các đối tượng referral trong thư mục. Mặc định thì server thư mục sẽ từ chối việc xĩa hoặc sửa đổi một đối tượng referral và gởi tới khách hàng URL của tham chiếu LDAP. Việc kiếm sốt thực tế cần được cập nhật hoặc loại bỏ một nội dung referral phụ thuộc vào nhà cung cấp.
Server OpenLDAP hỗ trợ kiểm sốt Manage DSA IT được mơ tả trong RFC 3088. Kiểm sốt này thơng tin cho server rằng khách hàng dự định thao tác với các referral như là một nội dung bình thường. Khơng cĩ một yêu cầu nào đĩ là hành động quan trọng hay khơng quan trọng. Hoạt động này là để cho khách hàng thực hiện kiếm sốt.
Việc tạo ra một đối tượng Net::LDAP::Control đại diện ManageDSAIT chỉ đơn giản là liên quan tới việc xác định OID. Chúng ta xác định rằng server hỗ trợ kiểm sốt, khơng cĩ thơng tin tùy chọn nào được yêu cầu:
$manage_dsa = Net::LDAP::Control->(
type => "2.16.840.1.113730.3.4.2", critical => 1 );
Net::LDAP::Constant định nghĩa một số tên mà bạn cĩ thể dùng như viết tắt và OID khơng nhớ; chắc chắn rằng phải kiểm tra modun này trước khi viết code như trên. Các dịng code đĩ cĩ thể viết lại như sau:
$manage_dsa = Net::LDAP::Control->(
type => LDAP_CONTROL_MANAGEDSAIT, critical => 1 );
Việc kiểm sốt này cĩ thể được bao gồm trong một hoạt động sửa đổi:
$msg = $ldap->modify(
"ou=department,dc=plainjoe,dc=org", replace =>
{ ref => "ldap://ldap2.plainjoe.org/ou=dept,dc=plainjoe,dc=org" }, control => $manage_dsa )