在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组来在我的存储库中设置写入权限。这使得它更容易维护。