2013-07-24 64 views
1

如何做用戶一個Perl的LDAP搜索/認證是在訪問組的屬性,或者它的子羣?Perl的LDAP搜索用戶是一個CN屬性

所有用戶信息(UID)在:

ou=Users,o=company,c=com 

訪問組是:

cn=Site Full Access,ou=Access,o=company,c=com 

訪問組具有用戶和子組像屬性:

uniquemember | uid=usernameA,ou=Users,o=company,c=com 
uniquemember | uid=usernameB,ou=Users,o=company,c=com 
uniquemember | uid=usernameC,ou=Users,o=company,c=com 
uniquemember | cn=Site Full Access Employees,ou=Access,o=company,c=com 

(亞組具有它自己獨特的成員屬性)

驗證腳本的想法:

  1. 用他的登錄名/密碼(完成)綁定用戶。
  2. 如果成功的話,創建用戶的DN像uid=$username,ou=Users,o=company,c=com(完成)
  3. 通過cn=Site Full Access,ou=Access,o=company,c=com屬性迭代,如果遇到一羣,搜索用戶的DN這個羣體太

裏面比較它們的用戶的DN

  • 我使用的是Net :: LDAP,但沒有太多的代碼可以顯示,因爲有效的標準非常標準。這是uniquemember上市屬性:

    my $mesg = $ldap->bind ($user_dn, password=>"$pass"); 
    $mesg->code && return undef; 
    
    $mesg = $ldap->search(base=>$ldap_access_full, filter=>"(objectclass=*)"); 
    $mesg->code && return undef; 
    
    my @entries = $mesg->entries; 
    my $entry; 
    foreach $entry (@entries) 
    { 
        if ($entry->exists('uniquemember')) 
        { 
         my $ref = $entr->get_value('uniquemember', asref=>1); 
         for my $uid (@$ref) 
         { 
        print $uid . "<br/>"; 
         } 
        } 
    } 
    

    這給我的用戶的DN,而且小組,將有上市,並在一些遞歸函數比較數組。

    我該如何解決這個問題?也許有另一種方法來檢查密碼和訪問組,用戶仍然是訪問組的屬性或它的子組?我無法做任何LDAP修改。

  • 回答

    1

    這稱爲嵌套組。對於AD這裏是一個解決方案:How to retrieve all Groups from LDAP with Perl

    一種解決方案是忽略組,只允許用戶直接對象。

    如果您需要處理子組應該檢索條目,並檢查它是一個羣體或民族。如果你需要在很多層次上檢查它(子羣的子羣),那麼你需要做遞歸檢查。

    對於嵌套組中的一個電平。這是完整的一半,沒有測試,但你有這個想法。

    當然使用子程序,但我沒有用更容易理解(和缺乏時間)

    $mesg = $ldap->search(base=>$ldap_access_full, filter=>"(objectclass=*)",attrs => [qw(uniquemember)]); 
    $mesg->code && die $mesg->code; 
    
    my @entries = $mesg->entries; 
    my $entry; 
    
    foreach $entry (@entries) { 
        my @uniquemembers = $entr->get_value('uniquemember'); 
        foreach my $uniquemember (@uniquemembers){ 
         #get entry 
         $mesg = $ldap->search(base=>$uniquemember, filter=>"(objectclass=*)", attrs => [qw(objectclass uid uniquemember)], scope => 'base'); 
         $mesg->code && die $mesg->code; 
         #if is a group or user? 
         my $uniquemember_entry = ($mesg->entries)[0]; 
         my @objectclasses = $uniquemember_entry->get_value('objectclass'); 
    
         my $uid = $uniquemember_entry->get_value('uid'); 
         if (grep {/user/i} @objectclasses || defined $uid){ 
          print "$uniquemember has uid: $uid\n"; 
    
         } elsif (grep {/group/i} @objectclasses){ 
          print "it is a group: $uniquemember\n"; 
          #get its members 
          my @nested_group_uniquemembers = $uniquemember_entry->get_value('uniquemember');  
          #get entries 
          foreach my $nested_group_uniquemember (@nested_group_uniquemembers){ 
           $mesg = $ldap->search(base=>$nested_group_uniquemember, filter=>"(objectclass=*)", attrs => [qw(objectclass uid uniquemember)], scope => 'base'); 
           $mesg->code && die $mesg->code;   
          } 
          #check it is an user or group... 
         } else { 
    
         } 
        } 
    } 
    
    +0

    謝謝。這實際上與我最後做的非常相似,但是讓我意識到我做出的一些微小的性能錯誤。另外,我使用'if($ uniquemember =〜/^cn = /)'來檢查它是否是一個組。這可能比用ldap-> search打開每個唯一成員要快一些。 – yosh

    +0

    它可以工作,但如果有人創建一個像cn = john這樣的人物對象呢? – user1126070