Доброе время суток, я сталкивался с проблемой создания фильтра для LDAP.
Несколько замечаний перед фактическим вопросом:
Фамилия = Family Name (will be presented as FamilyName)
Имя = Name (will be presented as Name)
Отчество = Patronymic (will be presented as Patronymic)
У меня есть пользователь со следующей информацией в AD:
CN=Фамилия Имя Отчество
sn=FamilyName
givenname=Name
Я хочу предоставить следующие функциональные возможности:
- Пользователь может либо ввести
Name FamilyName
в поле на веб-сайте, это приведет к массиву из 2 фильтров для Name FamilyName
и FamilyName Name
' - Пользователь может ввести
Имя Фамилия
, и поиск долженпереключиться с (& (sn =) (имя =)) на (cn =)
В настоящее время у меня есть следующий фрагмент кода для выполнения первого варианта:
/**
* Generate search terms
* @param string $query
* @return LDAPSearcher
*/
protected function generateSearchTerms(string $query) : self {
$this->searchTerms = [];
$explode = explode(' ', $query);
$combinations = [];
array_combinations($explode, $combinations);
foreach($combinations as $index => $combination) {
if (false !== strpos($combination, ' ')) {
[$firstName, $lastName] = explode(' ', $combination);
$this->searchTerms[] = [
'sn' => $lastName,
'cn' => $combination,
'givenname' => $firstName,
'filter' => '(&(sn=' . $firstName . ')(givenname=' . $lastName . '))'
];
}
}
return $this;
}
И это прекрасно работает, когда пользователь использует латинское представление его / ее имени и фамилии, но когда я хочу перейти на использование CN, я понятия не имею, как это сделать.
Я пробовал следующий фрагменткода для фильтра, однако он показывает, что фильтр неправильный:
((&(sn=' . $firstName . ')(givenname=' . $lastName . '))|(cn=' . $combination . '*))
Любая помощь действительно приветствуется
PS Неважно, какие переменные я назначаю SN или GivenName, так как комбинации в любом случае будут соответствовать правильному пользователю, я выполняю не более 3 поисков для каждого пользователя, чтобыубедитесь, что найден правильный (просто чтобы исключить возможность ответов с присвоением правильных значений переменным)
PPS Комбинации генерируются с использованием следующего фрагмента кода
if (! function_exists('array_combinations')) {
function array_combinations(array $source, array &$target, ?string $tempString = null) {
if ($tempString !== null) {
$target[] = $tempString;
}
$size = \count($source);
for ($i = 0; $i < $size; $i++) {
$copy = $source;
$element = array_splice($copy, $i, 1);
$tmp = null;
if ($tempString !== null) {
$tmp = $tempString . ' ' . $element[0];
} else {
$tmp = $element[0];
}
if (\count($copy) > 0) {
array_combinations($copy, $target, $tmp);
} else {
$target[] = $tmp;
}
}
}
}