Ruby - Hướng dẫn LDAP

Ruby / LDAP là một thư viện mở rộng cho Ruby. Nó cung cấp giao diện cho một số thư viện LDAP như OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory.

API chung để phát triển ứng dụng được mô tả trong RFC1823 và được hỗ trợ bởi Ruby / LDAP.

Cài đặt Ruby / LDAP

Bạn có thể tải xuống và cài đặt gói Ruby / LDAP hoàn chỉnh từ SOURCEFORGE.NET .

Trước khi cài đặt Ruby / LDAP, hãy đảm bảo rằng bạn có các thành phần sau:

  • Ruby 1.8.x (ít nhất 1.8.2 nếu bạn muốn sử dụng ldap / control).
  • OpenLDAP, Netscape SDK, Windows 2003 hoặc Windows XP.

Bây giờ, bạn có thể sử dụng phương pháp Cài đặt Ruby tiêu chuẩn. Trước khi bắt đầu, nếu bạn muốn xem các tùy chọn có sẵn cho extconf.rb, hãy chạy nó với tùy chọn '--help'.

$ ruby extconf.rb [--with-openldap1|--with-openldap2| \
                   --with-netscape|--with-wldap32]
$ make
$ make install

NOTE- Nếu bạn đang xây dựng phần mềm trên Windows, bạn có thể cần sử dụng nmake thay vì make .

Thiết lập kết nối LDAP

Đây là một quy trình gồm hai bước -

Bước 1 - Tạo đối tượng kết nối

Sau đây là cú pháp để tạo kết nối đến thư mục LDAP.

LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
  • host- Đây là ID máy chủ chạy thư mục LDAP. Chúng tôi sẽ lấy nó làm localhost .

  • port- Đây là cổng đang được sử dụng cho dịch vụ LDAP. Các cổng LDAP tiêu chuẩn là 636 và 389. Đảm bảo rằng cổng nào đang được sử dụng tại máy chủ của bạn, nếu không bạn có thể sử dụng LDAP :: LDAP_PORT.

Lệnh gọi này trả về kết nối LDAP :: Conn mới với máy chủ, máy chủ lưu trữ , trên cổng cổng .

Bước 2 - Ràng buộc

Đây là nơi chúng tôi thường chỉ định tên người dùng và mật khẩu mà chúng tôi sẽ sử dụng cho phần còn lại của phiên.

Sau đây là cú pháp để liên kết kết nối LDAP, sử dụng DN, dn, thông tin xác thực, pwdvà phương thức ràng buộc, method -

conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)do
....
end

Bạn có thể sử dụng cùng một phương pháp mà không cần khối mã. Trong trường hợp này, bạn cần phải hủy liên kết kết nối một cách rõ ràng như sau:

conn.bind(dn = nil, password = nil, method = LDAP::LDAP_AUTH_SIMPLE)
....
conn.unbind

Nếu một khối mã được đưa ra, bản thân sẽ được nhường cho khối.

Bây giờ chúng tôi có thể thực hiện các thao tác tìm kiếm, thêm, sửa đổi hoặc xóa bên trong khối của phương thức liên kết (giữa ràng buộc và hủy liên kết), miễn là chúng tôi có quyền thích hợp.

Example

Giả sử chúng ta đang làm việc trên một máy chủ cục bộ, hãy đặt mọi thứ lại với nhau bằng máy chủ lưu trữ, miền, id người dùng và mật khẩu thích hợp, v.v.

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')
....
conn.unbind

Thêm mục nhập LDAP

Thêm một mục LDPA là một quá trình gồm hai bước -

Bước 1 - Tạo đối tượng LDAP :: Mod

Chúng ta cần truyền đối tượng LDAP :: Mod tới phương thức conn.add để tạo một mục nhập. Đây là một cú pháp đơn giản để tạo đối tượng LDAP :: Mod -

Mod.new(mod_type, attr, vals)
  • mod_type - Một hoặc nhiều tùy chọn LDAP_MOD_ADD, LDAP_MOD_REPLACE hoặc LDAP_MOD_DELETE.

  • attr - phải là tên của thuộc tính sẽ hoạt động.

  • vals- là một mảng các giá trị liên quan đến attr . Nếu vals chứa dữ liệu nhị phân, mod_type phải được OR'ed (|) một cách hợp lý với LDAP_MOD_BVALUES.

Lệnh gọi này trả về đối tượng LDAP :: Mod , có thể được truyền cho các phương thức trong lớp LDAP :: Conn, chẳng hạn như Conn # add, Conn # add_ext, Conn # mod và Conn # mod_ext.

Bước 2 - Gọi phương thức conn.add

Khi chúng ta đã sẵn sàng với đối tượng LDAP :: Mod , chúng ta có thể gọi phương thức conn.add để tạo một mục nhập. Đây là cú pháp để gọi phương thức này:

conn.add(dn, attrs)

Phương thức này thêm một mục nhập có DN, dn và các thuộc tính, attrs . Ở đây, phần đính kèm phải là một mảng các đối tượng LDAP :: Mod hoặc một hàm băm của các cặp mảng thuộc tính / giá trị.

Example

Đây là một ví dụ hoàn chỉnh, sẽ tạo ra hai mục nhập thư mục -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
entry1 = [
   LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','domain']),
   LDAP.mod(LDAP::LDAP_MOD_ADD,'o',['TTSKY.NET']),
   LDAP.mod(LDAP::LDAP_MOD_ADD,'dc',['localhost']),
]

entry2 = [
   LDAP.mod(LDAP::LDAP_MOD_ADD,'objectclass',['top','person']),
   LDAP.mod(LDAP::LDAP_MOD_ADD, 'cn', ['Zara Ali']),
   LDAP.mod(LDAP::LDAP_MOD_ADD | LDAP::LDAP_MOD_BVALUES, 'sn', 
                     ['ttate','ALI', "zero\000zero"]),
]

begin
   conn.add("dc = localhost, dc = localdomain", entry1)
   conn.add("cn = Zara Ali, dc = localhost, dc =  localdomain", entry2)
rescue LDAP::ResultError
   conn.perror("add")
   exit
end
conn.perror("add")
conn.unbind

Sửa đổi mục nhập LDAP

Sửa đổi một mục nhập tương tự như thêm một mục nhập. Chỉ cần gọi phương thức sửa đổi thay vì thêm với các thuộc tính để sửa đổi. Đây là một cú pháp đơn giản của phương thức sửa đổi .

conn.modify(dn, mods)

Phương thức này sửa đổi một mục nhập có DN, dn và các thuộc tính, mod . Ở đây, các mod phải là một mảng các đối tượng LDAP :: Mod hoặc một hàm băm của các cặp mảng thuộc tính / giá trị.

Thí dụ

Để sửa đổi họ của mục nhập, mà chúng tôi đã thêm trong phần trước, chúng tôi sẽ viết:

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
entry1 = [
   LDAP.mod(LDAP::LDAP_MOD_REPLACE, 'sn', ['Mohtashim']),
]

begin
   conn.modify("cn = Zara Ali, dc = localhost, dc = localdomain", entry1)
rescue LDAP::ResultError
   conn.perror("modify")
   exit
end
conn.perror("modify")
conn.unbind

Xóa mục nhập LDAP

Để xóa một mục nhập, hãy gọi phương thức xóa với tên phân biệt là tham số. Đây là một cú pháp đơn giản của phương thức xóa .

conn.delete(dn)

Phương thức này xóa một mục nhập có DN, dn .

Thí dụ

Để xóa mục nhập Zara Mohtashim , mà chúng tôi đã thêm trong phần trước, chúng tôi sẽ viết:

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.delete("cn = Zara-Mohtashim, dc = localhost, dc = localdomain")
rescue LDAP::ResultError
   conn.perror("delete")
   exit
end
conn.perror("delete")
conn.unbind

Sửa đổi tên phân biệt

Không thể sửa đổi tên phân biệt của mục nhập bằng phương thức sửa đổi . Thay vào đó, hãy sử dụng phương thức modrdn . Đây là cú pháp đơn giản của phương thức modrdn -

conn.modrdn(dn, new_rdn, delete_old_rdn)

Phương thức này sửa đổi RDN của mục nhập với DN, dn , tạo cho nó RDN mới, new_rdn . Nếu delete_old_rdntrue , giá trị RDN cũ sẽ bị xóa khỏi mục nhập.

Thí dụ

Giả sử chúng ta có mục nhập sau:

dn: cn = Zara Ali,dc = localhost,dc = localdomain
cn: Zara Ali
sn: Ali
objectclass: person

Sau đó, chúng ta có thể sửa đổi tên phân biệt của nó bằng mã sau:

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.modrdn("cn = Zara Ali, dc = localhost, dc = localdomain", "cn = Zara Mohtashim", true)
rescue LDAP::ResultError
   conn.perror("modrdn")
   exit
end
conn.perror("modrdn")
conn.unbind

Thực hiện Tìm kiếm

Để thực hiện tìm kiếm trên thư mục LDAP, hãy sử dụng phương pháp tìm kiếm với một trong ba chế độ tìm kiếm khác nhau -

  • LDAP_SCOPE_BASEM - Chỉ tìm kiếm nút cơ sở.

  • LDAP_SCOPE_ONELEVEL - Tìm kiếm tất cả các nút con của nút cơ sở.

  • LDAP_SCOPE_SUBTREE - Tìm kiếm toàn bộ cây con bao gồm cả nút cơ sở.

Thí dụ

Ở đây, chúng ta sẽ tìm kiếm toàn bộ cây con của mục nhập dc = localhost, dc = localdomain cho các đối tượng người -

#/usr/bin/ruby -w

require 'ldap'

$HOST =    'localhost'
$PORT =    LDAP::LDAP_PORT
$SSLPORT = LDAP::LDAPS_PORT

base = 'dc = localhost,dc = localdomain'
scope = LDAP::LDAP_SCOPE_SUBTREE
filter = '(objectclass = person)'
attrs = ['sn', 'cn']

conn = LDAP::Conn.new($HOST, $PORT)
conn.bind('cn = root, dc = localhost, dc = localdomain','secret')

conn.perror("bind")
begin
   conn.search(base, scope, filter, attrs) { |entry|
      # print distinguished name
      p entry.dn
      # print all attribute names
      p entry.attrs
      # print values of attribute 'sn'
      p entry.vals('sn')
      # print entry as Hash
      p entry.to_hash
   }
rescue LDAP::ResultError
   conn.perror("search")
   exit
end
conn.perror("search")
conn.unbind

Điều này gọi khối mã đã cho cho mỗi mục nhập phù hợp trong đó mục nhập LDAP được đại diện bởi một phiên bản của lớp LDAP :: Entry. Với tham số cuối cùng của tìm kiếm, bạn có thể chỉ định các thuộc tính mà bạn quan tâm, bỏ qua tất cả các thuộc tính khác. Nếu bạn chuyển nil ở đây, tất cả các thuộc tính được trả về giống như "SELECT *" trong cơ sở dữ liệu quan hệ.

Phương thức dn (bí danh cho get_dn) của lớp LDAP :: Entry trả về tên phân biệt của mục nhập và với phương thức to_hash, bạn có thể nhận được biểu diễn băm của các thuộc tính của nó (bao gồm cả tên phân biệt). Để nhận danh sách các thuộc tính của mục nhập, hãy sử dụng phương thức attrs (bí danh cho get_attributes). Ngoài ra, để lấy danh sách các giá trị của một thuộc tính cụ thể, hãy sử dụng phương thức vals (bí danh cho get_values).

Xử lý lỗi

Ruby / LDAP định nghĩa hai lớp ngoại lệ khác nhau:

  • Trong trường hợp xảy ra lỗi, các phương thức mới, liên kết hoặc hủy liên kết sẽ đưa ra ngoại lệ LDAP :: Lỗi.

  • Trong trường hợp thêm, sửa đổi, xóa hoặc tìm kiếm một thư mục LDAP, làm tăng LDAP :: ResultError.

Đọc thêm

Để biết chi tiết đầy đủ về các phương pháp LDAP, vui lòng tham khảo tài liệu tiêu chuẩn cho Tài liệu LDAP .