在Perl中检查用户组Net :: LDAP

问题描述:

我有一个Perl Subversion预提交钩子,它允许我验证用户是否有权限更改或添加到Subversion存储库中的特定点。它使用如下所示的控制文件:在Perl中检查用户组Net :: LDAP

[GROUP SERVER] 
users = bob, ted, carol, alice 

[GROUP CLIENT] 
users = tom, dick, harry 

[FILE Client Developers don't touch the Server] 
file = proj/server 
users = @CLIENT 
permission = read-only 

[FILE Server people don't touch the Client] 
file = proj/client 
users = @SERVER 
permission = read-only 

[FILE Let Tom Do everything] 
file = .* 
users = tom 
permission = read-write 

正如您所看到的,我可以在设置权限时定义组和使用组。如果我可以使用LDAP组来做同样的事情,我认为这会是一个噱头。这样,我们的Windows管理员就可以找出谁在哪个组中,这让我有更多时间来保持我的Facebook状态为最新状态。

我已经LDAP配置从而颠覆:

<Location /mfx> 
    DAV svn 
    SVNParentPath /subversion/svn_repos 
    AuthType basic 
    AuthName "Source Repository" 
    AuthBasicProvider ldap 
    AuthzLDAPAuthoritative off 
    AuthLDAPURL "ldap://ldapserver:3268/dc=mycompany,dc=com?sAMAccountName" NONE 
    AuthLDAPBindDN "CN=SubVersion,OU=Users,OU=Accounts,DC=mycompany,DC=com" 
    AuthLDAPBindPassword "Swordfish" 
    Require valid-user 
</Location> 

我已经得到了我们的LDAP服务器的连接工作正常,但现在,我需要找出哪些用户是组我。用户的Subversion名称为$svnUser,现在我需要在我们的LDAP数据库中找到该用户,并验证它们所在的各个组(它们的LDAP记录中的成员值)。但是,我不知道如何去做这件事。

到目前为止,我的代码看起来是这样的:

#! /usr/bin/env perl 
# 

use strict; 
use warnings; 
use feature qw(say); 

use constant { 
    LDAP_URL => "ldapserver", 
    LDAP_PORT => 3268, 
    LDAP_SCHEME => "ldap", 
    BIND_DN => "CN=SubVersion,OU=Users,OU=Accounts,DC=mycompany,DC=com", 
    BIND_PWORD => "Swordfish", 
    USER_DN => "sAMAccountName", 
}; 

use Net::LDAP; 

# 
# Create LDAP Connection 
# 

my $ldap = Net::LDAP->new(LDAP_URL, port=> LDAP_PORT, scheme=> LDAP_SCHEME); 
my $message; 

$message = $ldap->bind(BIND_DN, password => BIND_PWORD); 

if ($message->code != 0) { 
    die qq(Error in LDAP Binding:) . $message->error_desc; 
} 

现在,我需要做的$ldap->search,但是是什么?我只是被语法弄糊涂了。

好吧,我花了一段时间,但我想它了...

这本来是有益的,如果有一些示例代码,但看了几LDAP文件后,我发现我可以做这样的事情:

(sAMAccountName=$user) 

所以,我想这一点:

my $results = $ldap->search(filter => USER_DN . "=$svnUser", 
          attrs => "memberOf"); 

我认为这将只返回的memberOf属性,但没有。事实上,它返回了一个单一成员的数组,虽然我知道这个特定的用户是三个组的成员。

我花了一段时间才意识到它返回了一个Net::LDAP::Search对象,这意味着我必须查找该模块才能找到方法。从那里,我发现我可以使用pop_entry方法检索一个Net::LDAP::Entry对象。好吧,另一个CPAN页面可以找到。

从那里,我可以在sMAAccountName上做一个get_value方法,并获取一组代表该人所属组的DN。现在我可以解析Subversion将使用的组的名称。

这意味着我现在可以在我的预提交脚本中使用Windows组来在我的存储库中设置写入权限。这使得它更容易维护。