如何对用户作为访问组或其子组中的属性进行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属性)
身份验证脚本的想法:
uid=$username,ou=Users,o=company,c=com
(已完成)cn=Site Full Access,ou=Access,o=company,c=com
的属性并将其与用户的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修改。
答案 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 {
}
}
}