Как выполнить поиск/аутентификацию LDL Perl для пользователя, являющегося атрибутом в группе доступа или ее подгруппах?Perl LDAP поиск пользователя, являющегося атрибутом CN
Все пользователи (UIDs) находятся в:
ou=Users,o=company,c=com
группа Доступ:
cn=Site Full Access,ou=Access,o=company,c=com
группа доступа имеет пользователей и подгруппы в качестве атрибутов, таких как:
uniquemember | uid=usernameA,ou=Users,o=company,c=com
uniquemember | uid=usernameB,ou=Users,o=company,c=com
uniquemember | uid=usernameC,ou=Users,o=company,c=com
uniquemember | cn=Site Full Access Employees,ou=Access,o=company,c=com
(подгруппа имеет его собственные уникальные атрибуты)
Идея сценария аутентификации:
- Связать пользователя с его логином/паролем (сделано).
- В случае успеха, создать DN пользователя, как
uid=$username,ou=Users,o=company,c=com
(сделано) - перебирать атрибутов
cn=Site Full Access,ou=Access,o=company,c=com
и сравнить их с пользователем DN - Если обнаружена группа, поиск DN пользователя в этой группе слишком
Я использую Net :: LDAP, но не так много кода для показа, так как все работает довольно стандартно. Это перечисление uniquemember атрибутов:
my $mesg = $ldap->bind ($user_dn, password=>"$pass");
$mesg->code && return undef;
$mesg = $ldap->search(base=>$ldap_access_full, filter=>"(objectclass=*)");
$mesg->code && return undef;
my @entries = $mesg->entries;
my $entry;
foreach $entry (@entries)
{
if ($entry->exists('uniquemember'))
{
my $ref = $entr->get_value('uniquemember', asref=>1);
for my $uid (@$ref)
{
print $uid . "<br/>";
}
}
}
Это дает мне массив пользовательских DNs, но и группы, которые должны быть перечислены и сравниваются в некоторой рекурсивной функции.
Как подойти к этому? Возможно, есть еще один способ проверить как пароль, так и группу доступа, при этом пользователь по-прежнему является атрибутом группы доступа или ее подгрупп? Я не могу изменять LDAP.
Спасибо. Это на самом деле очень похоже на то, что я сделал в конце, но заставило меня понять некоторые незначительные ошибки производительности, которые я сделал. Кроме того, я использую 'if ($ uniquemember = ~/^ cn = /)', чтобы проверить, является ли это группой. Это может быть немного быстрее, чем открытие каждого пользователя с помощью ldap-> search. – yosh
Это может сработать, но что, если кто-то создает объект человека, например cn = john, doe? – user1126070