Проверка групп пользователей в Perl Net :: LDAP - PullRequest
1 голос
/ 20 июня 2011

У меня есть ловушка предварительной фиксации 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.

У меня настроен LDAP как в Subversion:

<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 и проверьте различные группы, в которых они находятся (что является значением memberOf в их записи 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, но на чем? Я просто озадачен синтаксисом.

1 Ответ

2 голосов
/ 21 июня 2011

Хорошо, это заняло у меня некоторое время, но я понял это ...

Было бы полезно, если бы был какой-то пример кода, но после прочтения нескольких документов 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 в своем сценарии предварительной фиксации, чтобы установить разрешения на запись в моем хранилище. Это делает его намного проще в обслуживании.

...