Ruby - LDAP Eğitimi

Ruby / LDAP, Ruby için bir uzantı kitaplığıdır. OpenLDAP, UMich LDAP, Netscape SDK, ActiveDirectory gibi bazı LDAP kitaplıklarına arayüz sağlar.

Uygulama geliştirme için ortak API, RFC1823'te açıklanmıştır ve Ruby / LDAP tarafından desteklenir.

Ruby / LDAP Kurulumu

SOURCEFORGE.NET'ten eksiksiz bir Ruby / LDAP paketi indirebilir ve kurabilirsiniz .

Ruby / LDAP'yi kurmadan önce, aşağıdaki bileşenlere sahip olduğunuzdan emin olun -

  • Ruby 1.8.x (ldap / control kullanmak istiyorsanız en az 1.8.2).
  • OpenLDAP, Netscape SDK, Windows 2003 veya Windows XP.

Artık standart Ruby Kurulum yöntemini kullanabilirsiniz. Başlamadan önce, extconf.rb için mevcut seçenekleri görmek istiyorsanız, '--help' seçeneğiyle çalıştırın.

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

NOTE- Yazılımı Windows üzerinde oluşturuyorsanız , make yerine nmake kullanmanız gerekebilir .

LDAP Bağlantısı Kurun

Bu iki aşamalı bir süreçtir -

Adım 1 - Bağlantı Nesnesi Oluşturun

Aşağıda, bir LDAP dizinine bağlantı oluşturmak için sözdizimi verilmiştir.

LDAP::Conn.new(host = 'localhost', port = LDAP_PORT)
  • host- Bu, LDAP dizinini çalıştıran ana bilgisayar kimliğidir. Bunu localhost olarak alacağız .

  • port- Bu, LDAP hizmeti için kullanılan bağlantı noktasıdır. Standart LDAP bağlantı noktaları 636 ve 389'dur. Sunucunuzda hangi bağlantı noktasının kullanıldığından emin olun, aksi takdirde LDAP :: LDAP_PORT'u kullanabilirsiniz.

Bu çağrı , bağlantı noktası bağlantı noktasındaki sunucuya, ana bilgisayara yeni bir LDAP :: Conn bağlantısı döndürür .

Adım 2 - Bağlama

Bu, genellikle oturumun geri kalanında kullanacağımız kullanıcı adı ve parolayı belirttiğimiz yerdir.

Aşağıda, DN kullanarak bir LDAP bağlantısını bağlamak için sözdizimi verilmiştir, dnkimlik bilgisi, pwdve bağlama yöntemi, method -

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

Aynı yöntemi bir kod bloğu olmadan da kullanabilirsiniz. Bu durumda, bağlantıyı aşağıdaki gibi açıkça çözmeniz gerekir:

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

Bir kod bloğu verilirse, self bloğa verilir .

Artık uygun izinlere sahip olmamız koşuluyla, bağlama yönteminin bloğu içinde (bağlama ve çözme arasında) arama, ekleme, değiştirme veya silme işlemleri gerçekleştirebiliriz.

Example

Yerel bir sunucu üzerinde çalıştığımızı varsayarsak, uygun ana bilgisayar, etki alanı, kullanıcı kimliği ve şifre vb. İle bir araya getirelim.

#/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

LDAP Girişi Ekleme

Bir LDPA girişi eklemek iki adımlı bir işlemdir -

Adım 1 - LDAP :: Mod nesnesinin oluşturulması

Bir girdi oluşturmak için conn.add yöntemine LDAP :: Mod nesne geçişine ihtiyacımız var . İşte LDAP :: Mod nesnesini oluşturmak için basit bir sözdizimi -

Mod.new(mod_type, attr, vals)
  • mod_type - Bir veya daha fazla seçenek LDAP_MOD_ADD, LDAP_MOD_REPLACE veya LDAP_MOD_DELETE.

  • attr - üzerinde işlem yapılacak özelliğin adı olmalıdır.

  • vals- öznitelik ile ilgili bir değerler dizisidir . Eğer vals iki veriler içeriyor, mod_type LDAP_MOD_BVALUES ile | () mantıksal OR'ed edilmelidir.

Bu çağrı , LDAP :: Conn sınıfındaki Conn # add, Conn # add_ext, Conn # modifiye ve Conn # modify_ext gibi yöntemlere aktarılabilen LDAP :: Mod nesnesini döndürür .

Adım 2 - conn.add Yönteminin çağrılması

LDAP :: Mod nesnesiyle hazır olduğumuzda, bir girdi oluşturmak için conn.add yöntemini çağırabiliriz . İşte bu yöntemi çağırmak için bir sözdizimi -

conn.add(dn, attrs)

Bu yöntem DN ile bir giriş ekler dn ve özelliklerini, attrs . Burada, öznitelikler ya bir LDAP :: Mod nesneleri dizisi ya da öznitelik / değer dizi çiftlerinin bir karması olmalıdır.

Example

İşte iki dizin girişi oluşturacak eksiksiz bir örnek -

#/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

Bir LDAP Girişini Değiştirme

Bir girişi değiştirmek, bir giriş eklemeye benzer. Değiştirilecek niteliklerle eklemek yerine değiştirme yöntemini çağırmanız yeterlidir. İşte değiştirme yönteminin basit bir sözdizimi .

conn.modify(dn, mods)

Bu yöntem, DN, dn ve öznitelikler, modlar ile bir girişi değiştirir . Burada, modlar ya bir LDAP :: Mod nesneleri dizisi ya da bir öznitelik / değer dizisi çiftleri karması olmalıdır.

Misal

Önceki bölümde eklediğimiz girdinin soyadını değiştirmek için şunu yazardık -

#/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

Bir LDAP Girişini Silme

Bir girişi silmek için, parametre olarak ayırt edici adı olan silme yöntemini çağırın . İşte silme yönteminin basit bir sözdizimi .

conn.delete(dn)

Bu yöntem, DN, dn ile bir girişi siler .

Misal

Bir önceki bölümde eklediğimiz Zara Mohtashim girişini silmek için şunu yazardık -

#/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

Ayırt Edici Adı Değiştirme

Bir girişin ayırt edici adını değiştirme yöntemiyle değiştirmek mümkün değildir . Bunun yerine modrdn yöntemini kullanın . İşte modrdn yönteminin basit sözdizimi -

conn.modrdn(dn, new_rdn, delete_old_rdn)

Bu yöntem girdinin RDN'sini DN, dn ile değiştirerek ona yeni RDN, new_rdn verir . Eğer delete_old_rdn olduğu doğrudur , eski RDN'de değer girişi silinecektir.

Misal

Aşağıdaki girişe sahip olduğumuzu varsayalım -

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

Ardından, ayırt edici adını aşağıdaki kodla değiştirebiliriz -

#/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

Arama Yapma

Bir LDAP dizininde arama yapmak için , üç farklı arama modundan biriyle arama yöntemini kullanın -

  • LDAP_SCOPE_BASEM - Yalnızca temel düğümü arayın.

  • LDAP_SCOPE_ONELEVEL - Temel düğümün tüm alt öğelerini arayın.

  • LDAP_SCOPE_SUBTREE - Temel düğüm dahil tüm alt ağacı arayın.

Misal

Burada, kişi nesneleri için dc = localhost, dc = localdomain girişinin tüm alt ağacını arayacağız -

#/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

Bu, LDAP girişinin LDAP :: Entry sınıfının bir örneği tarafından temsil edildiği her eşleşen giriş için verilen kod bloğunu çağırır. Son arama parametresi ile, ilgilendiğiniz öznitelikleri, diğerlerini atlayarak belirtebilirsiniz. Buraya nil geçerseniz, tüm öznitelikler ilişkisel veritabanlarında "SELECT *" olarak döndürülür.

LDAP :: Entry sınıfının dn yöntemi (get_dn için takma ad) girdinin ayırt edici adını döndürür ve to_hash yöntemiyle, özniteliklerinin karma temsilini (ayırt edici ad dahil) elde edebilirsiniz. Bir girdinin özniteliklerinin bir listesini almak için attrs yöntemini kullanın (get_attributes için takma ad). Ayrıca, belirli bir özniteliğin değerlerinin listesini almak için vals yöntemini kullanın (get_values ​​için takma ad).

Hataları Yönetme

Ruby / LDAP iki farklı istisna sınıfı tanımlar -

  • Bir hata durumunda, yeni, bağlama veya çözme yöntemleri bir LDAP :: Hata istisnası oluşturur.

  • Bir LDAP dizini ekleme, değiştirme, silme veya arama durumunda bir LDAP :: ResultError yükseltin.

Daha fazla okuma

LDAP yöntemleriyle ilgili tüm ayrıntılar için, lütfen LDAP Belgeleri için standart belgelere bakın .