使用Net :: LDAPS在Perl中对特定用户的组成员身份

时间:2015-02-19 21:51:25

标签: perl ldap ldap-query

我一直在寻找各种网站以获得一些帮助,但不是很远。我的目标是在登录成功后检查组成员身份。登录部分工作正常,但我想获取登录用户的组列表,以将其与特定用户进行比较。如果他们不是该组的成员,他们将被注销,会话将被删除并返回到登录页面,否则他们可以继续。

以下是代码:

my $base = "ou=Groups,ou=Services,dc=example,cd=com";
my $mesg = $ldap->search(
                         filter=>"(uid=$userid)",
                         base=>"$base",
                         scope=>'children',
    );

my @entries = $mesg->entries;

print("mesg = <BR>");
print(Dumper($mesg));

这是$ mesg的输出:

$VAR1 = bless( {
    'parent' => bless( {
        'net_ldap_version' => 3,
        'net_ldap_scheme' => 'ldaps',
        'net_ldap_debug' => 0,
        'net_ldap_socket' => bless( \*Symbol::GEN0, 'IO::Socket::SSL' ),
        'net_ldap_host' => 'ldap.example.com',
        'net_ldap_uri' => 'ldap.example.com',
        'net_ldap_resp' => {},
        'net_ldap_mesg' => {},
        'net_ldap_async' => 0,
        'net_ldap_port' => '636',
        'net_ldap_refcnt' => 1
    }, 'Net::LDAPS' ),
   'errorMessage' => 'NDS error: no such entry (-601)',
   'ctrl_hash' => undef,
   'resultCode' => 32,
   'callback' => undef,
   'mesgid' => 2,
   'matchedDN' => '',
   'controls' => undef,
   'raw' => undef
}, 'Net::LDAP::Search' ); 

我可以看到NDS消息说没有这样的条目,所以我假设我的搜索查询是错误所在,但错误是逃避我。有什么建议?我也试过没有scope=>'children'行,没有任何改变。

感谢。

更新

这就是我最终做的,并且成功了......不得不稍微调整一下另一个人的答案,但最终得到了我想要的东西。

my $mesg = $ldap->search(
    filter=>"(&(objectClass=group)(memberUid=$userid)(member=$userdn))",
    base=>"$base",
    scope=>'subtree',
    attrs=>[qw(memberUid)],
 );

my $searchresults = $mesg->as_struct;                                                                      
my %searchhash = %$searchresults;       # dereference the hash

my @members = @ { $searchhash{$base}{memberuid} };   # pick out just the memberuid array from the hash

然后我基本上迭代了该组中的用户(@members),如果登录用户在那里, 他们经过身份验证,如果没有,他们的会话信息被删除,脚本退出。

与下面给出的答案不完全相同,但我们的树中没有唯一成员。无论哪种方式,希望这有助于某人。

1 个答案:

答案 0 :(得分:4)

当您在用户中登录时,我假设您正在使用其专有名称执行成功绑定。

我会在组中搜索用户,而不是搜索所有用户组并查找特定组。我还假设您使用groupOfUniqueNames组对象类来对用户进行分组。我会做这样的事情......

# assuming you already have this value in a variable from the authN step
my $user_dn = "cn=dave,ou=people,dc=example,dc=com"

my $base = "cn=GroupToCheck,ou=Groups,ou=Services,dc=example,cd=com";
my $mesg = $ldap->search(
                         filter=>"(uniquemember=$user_dn)",
                         base=>"$base",
                         scope=>'base'
);

如果您得到结果,那么该用户就在该组中。如果您没有得到任何结果,则该用户不在该组中。


如果您确实想要获取所有组,那么这将返回该用户所属的所有组的组名。

# assuming you already have this value in a variable from the authN step
my $user_dn = "cn=dave,ou=people,dc=example,dc=com"

my $base = "ou=Groups,ou=Services,dc=example,cd=com";
my $mesg = $ldap->search(
                         filter=>"(uniquemember=$user_dn)",
                         base=>"$base",
                         scope=>'sub',
                         attrs => ['cn']
);