LDAP и сбой соединения PHP

Программисты должны избегать методов, скрывающих наследование любой ценой.

По моему опыту, практически в каждом месте, где я когда-либо видел унаследованный метод сокрытия, это вызывало проблемы. Скрытие метода приводит к тому, что объекты ведут себя по-разному, когда к ним обращаются через ссылку на базовый тип и ссылку на производный тип - как правило, это плохо. Хотя многие программисты формально не знают об этом, большинство интуитивно ожидают, что объекты будут придерживаться принципа замены Лискова . Когда объекты нарушают это ожидание, многие из допущений, присущих объектно-ориентированным системам, могут начать разрушаться. Наиболее вопиющие случаи, которые я видел, это когда скрытый метод изменяет состояние экземпляра объекта. В этих случаях поведение объекта может изменяться тонкими способами, которые трудно отладить и диагностировать.

Хорошо, поэтому могут быть редкие случаи, когда скрытие методов действительно полезно и полезно - например, эмуляция ковариации возвращаемого типа методов в языках, которые ее не поддерживают. Но подавляющее большинство времени, когда разработчики используют сокрытие метода, происходит либо по незнанию (или по случайности), либо как способ взломать какую-то проблему, которая, вероятно, заслуживает лучшего подхода к проектированию. В целом, я видел полезные случаи сокрытия методов (не говоря уже о том, что других нет), когда метод без побочных эффектов, возвращающий некоторую информацию, скрыт тем, который вычисляет нечто более применимое к контексту вызова.

Такие языки, как C #, немного улучшили ситуацию, потребовав ключевое слово new для методов, которые скрывают метод базового класса - по крайней мере, помогая избежать принудительного использования скрытия методов. Но я нахожу, что многие люди все еще путают значение new со значением override - особенно потому, что в простых сценариях их поведение может выглядеть идентично. Было бы хорошо, если бы такие инструменты, как FxCop, действительно имели встроенные правила для выявления потенциально неправильного использования сокрытия методов.

Кстати, метод сокрытия с помощью наследования не следует путать с другими видами сокрытия - например, с помощью вложения - который я считаю допустимым и полезным конструктом с меньшим количеством потенциальных проблем.

16
задан Machavity 2 December 2015 в 13:41
поделиться

3 ответа

Я думаю, вам просто нужно установить версию протокола ldap равной 3

echo "<h3>LDAP query test</h3>";
echo "Connecting ...";

$ldap_server = 'ldaps://server';
$ldap_port = '636';

$ds = ldap_connect($ldap_server, $ldap_port);

if ($ds) 
{
    //add this
    if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) 
    {
        fatal_error("Failed to set LDAP Protocol version to 3, TLS not supported.");
    }
    echo "<br><br>Binding ..."; 
    $r=ldap_bind($ds);     // this is an "anonymous" bind, typically
                       // read-only access
    echo "Bind result is " . $r . "<br />";

    echo "Searching for (sn=S*) ...";
    // Search surname entry
    $sr=ldap_search($ds, "ou=people,o=server.ca,o=server", "uid=username*");  
    echo "Search result is " . $sr . "<br />";

    echo "Number of entires returned is " . ldap_count_entries($ds, $sr) . "<br />";

    echo "Getting entries ...<p>";
    $info = ldap_get_entries($ds, $sr);
    echo "Data for " . $info["count"] . " items returned:<p>";

    print_r($info);
    //    for ($i=0; $i<$info["count"]; $i++) {
    //        echo "dn is: " . $info[$i]["dn"] . "<br />";
    //        echo "first cn entry is: " . $info[$i]["cn"][0] . "<br />";
    //        echo "first email entry is: " . $info[$i]["mail"][0] . "<br /><hr />";
    //    }

    echo "Closing connection";
    ldap_close($ds);

} 
else 
{
    echo "<h4>Unable to connect to LDAP server</h4>";
}
0
ответ дан 30 November 2019 в 23:05
поделиться

Проблема не связана с фактическим процессом привязки (неверные учетные данные), поскольку предупреждение будет другим, если сервер LDAP не сможет аутентифицировать ваши учетные данные. Но, как заметил Пол Диксон , использование ldap_set_option ($ ds, LDAP_OPT_PROTOCOL_VERSION, 3) должно быть обязательным - хотя я не думаю, что это является причиной ваших проблем.

  • К какому типу сервера LDAP вы подключаетесь? OpenLDAP, Active Directory или что-то еще?
  • Какая операционная система компьютера, на котором запущена ваша программа PHP?
  • Используете ли вы самоподписанный сертификат SSL на сервере LDAP, и является ли центр сертификации для данного сертификата, которому доверяет компьютер, на котором запущена ваша программа PHP?
  • На каком порту работает сервер LDAP? 636 будет "официальным" порт для LDAPS. Возможно, вы можете явно добавить порт к адресу сервера: ldaps: // <>: 636 .

ext / ldap имеет некоторые проблемы с защищенными соединениями SSL / TLS. Вы можете попробовать добавить

TLS_REQCERT never

в ldap.conf ( /etc/ldap.conf или /etc/ldap/ldap.conf на * nix -системы) или для компьютеров Windows создайте ldap.conf с указанным выше содержимым в C: \ OpenLDAP \ sysconf \ ldap.conf (путь должен быть точным совпадением, поскольку он жестко запрограммированы в расширение).

9
ответ дан 30 November 2019 в 23:05
поделиться

Попробуйте включить «анонимные привязки» на вашем LDAP-сервере или используйте правильную привязку (имя пользователя / пароль).

например cn = ldapauthuser, ou = accounts, dc = Например, dc = com

-1
ответ дан 30 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: