1

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

[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 状态。

我在 Subversion 中配置了 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 记录中的memberOf值)。但是,我不知道该怎么做。

到目前为止,我的代码如下所示:

#! /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,但是做什么?我只是被语法弄糊涂了。

4

1 回答 1

2

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

如果有一些示例代码会很有帮助,但是在阅读了一些 LDAP 文档后,我发现我可以做这样的事情:

(sAMAccountName=$user)

所以我尝试了这个:

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

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

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

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

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

于 2011-06-20T20:10:51.013 回答