Perl LDAP 搜索作为 CN 属性的用户
Posted
技术标签:
【中文标题】Perl LDAP 搜索作为 CN 属性的用户【英文标题】:Perl LDAP search for user being a CN attribute 【发布时间】:2013-07-23 22:40:15 【问题描述】:如何对作为访问组或其子组中的属性的用户进行 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
(子组有自己的唯一成员属性)
认证脚本思路:
-
用他的登录名/密码绑定用户(完成)。
如果成功,创建用户的 DN,例如
uid=$username,ou=Users,o=company,c=com
(完成)
遍历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
【讨论】:
谢谢。这实际上与我最后所做的非常相似,但让我意识到我犯了一些小的性能错误。另外,我使用if ($uniquemember =~ /^cn=/)
来检查它是否是一个组。它可能比使用 ldap->search 打开每个 uniquemember 快一点。
它可以工作,但是如果有人创建一个像 cn=john, doe 这样的人对象呢?以上是关于Perl LDAP 搜索作为 CN 属性的用户的主要内容,如果未能解决你的问题,请参考以下文章
使用基于 memberOf 属性的 ldap 进行 Spring 安全认证