Perl LDAP搜索用户是CN属性

时间:2013-07-24 12:37:53

标签: perl authentication active-directory ldap

如何对用户作为访问组或其子组中的属性进行Perl LDAP搜索/身份验证?

所有用户(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

(子组有自己的uniquemember属性)

身份验证脚本的想法:

  1. 使用他的登录名/密码(已完成)绑定用户。
  2. 如果成功,请创建用户的DN,如uid=$username,ou=Users,o=company,c=com(已完成)
  3. 遍历cn=Site Full Access,ou=Access,o=company,c=com的属性并将其与用户的DN进行比较
  4. 如果遇到群组,也会在此群组中搜索用户的DN
  5. 我正在使用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 个答案:

答案 0 :(得分: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 {

        }
    }
}