Найти пользователя в AD LDAP - PullRequest
0 голосов
/ 07 марта 2019

Доброе время суток, я сталкивался с проблемой создания фильтра для 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

Я хочу предоставить следующие функциональные возможности:

  1. Пользователь может либо ввести Name FamilyName в поле на веб-сайте, это приведет к массиву из 2 фильтров для Name FamilyName и FamilyName Name '
  2. Пользователь может ввести Имя Фамилия, и поиск долженпереключиться с (& (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;
            }
        }

    }

}

1 Ответ

1 голос
/ 07 марта 2019

Ваш запрос действительно недействителен.

В синтаксисе запроса LDAP условие "this OR that" записывается как (|(this)(that)).Но вы поставили | между вашими условиями.Он должен быть спереди .Это должно выглядеть примерно так:

(|(&(sn=' . $firstName . ')(givenname=' . $lastName . '))(cn=' . $combination . '*))
...