【问题标题】:Checking User Groups in Perl Net::LDAP在 Perl Net::LDAP 中检查用户组
【发布时间】:2011-06-20 18:28:56
【问题描述】:

我有一个 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 服务器连接正常,但现在,我需要找出该用户所在的组。我在 $svnUser 中有用户的 Subversion 名称,现在我需要找到该用户在我们的 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-&gt;search,但是做什么?我只是被语法弄糊涂了。

【问题讨论】:

    标签: perl ldap-query netldap


    【解决方案1】:

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

    如果有一些示例代码会很有帮助,但是在阅读了一些 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 组在我的存储库中设置写入权限。这使它更容易维护。

    【讨论】:

      猜你喜欢
      • 2016-05-29
      • 1970-01-01
      • 2014-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      相关资源
      最近更新 更多