В настоящее время я работаю над своим первым скриптом LDAP на PHP с двумя связями.
Первое связывание, кажется, работает нормально, так как я получаю возврат результатов после успешного связывания с сервером для запросов.
Второе связывание, которое использует результат Отличительное имя от начального связывания, вызывает у меня некоторые проблемы.
При попытке второй привязки пустое поле пароля будет привязано к отличительному имени.
Однако, если введен неверный пароль, он не будет привязан правильно.
Почему пустые записи являются обязательными, в этом случае? Спасибо за любые предложения.
Вот код, который я использую:
//begin set parameters
$host = "*****";
$port = "3268";
$rdnUsername = "*****";//for accessing server
$rdnPassword = "*****";//for accessing server
$_connect = ldap_connect($host);
if (! $_connect) {
die ('no connection');
}
if (isset($rdnUsername) && isset($rdnPassword)) {
$args [] = $_connect;
$args [] = $rdnUsername;
$args [] = $rdnPassword;
}
if ( ! call_user_func_array ( 'ldap_bind', $args ) ) {
die (
sprintf('Could not bind to server %s. Returned Error was: [%s] %s',$host,ldap_errno($_connect),ldap_error($_connect))
);
}
if (! isset($filter)) {
$filter = "(userPrincipalName=".$_POST['username']."@school.edu)";
}
$trimmerdUsername = trim(preg_replace('/[^a-zA-Z0-9\-\_@\.]/', '', $_POST['username']));
$filter = str_replace($_POST['username'], $trimmerdUsername, $filter);
$attributes = array("name", "telephonenumber", "mail", "userprincipalname");
$ldap_dn = "dc=tcw,dc=net,dc=tceo,dc=edu";
$_ldapresults = ldap_search($_connect, $ldap_dn, $filter, $attributes, 0, 0, 10 ) or exit("Unable to search");
if (! $_ldapresults) {
die ('No user with that information found');
}
if (1 > ldap_count_entries($_connect, $_ldapresults)) {
die ('No user with that information found');
}
if (1 < ldap_count_entries($_connect, $_ldapresults )) {
die ('More than one user found with that information');
}
$_results = ldap_get_entries($_connect, $_ldapresults);
if (false === $_results) {
die ('no result set found');
}
ldap_free_result ( $_ldapresults );
$distinguishedName = $_results[0]['dn'];
$userPrincipalName = $_results[0]["userprincipalname"][0];
print "<pre>";
print_r ($_results);
print "</pre>";
echo "<br>userPrincipalName is: ".$userPrincipalName."<br>";
echo "<br>distinguishedName is: ".$distinguishedName."<br>";
$password = $_POST['password'];
$link_id = @ldap_bind($_connect, $distinguishedName, $password);
//if (false === $link_id) {
if ($link_id === false) {
die ('BIND failed');
}else{
echo "<br>success!<br>";
}
Без пароля ldap связывается анонимно.
Это определено в протоколе и требуется приложением, чтобы запретить привязку с пустым паролем.
Это также описано в документации ldap_bind PHP (http://php.net/ldap_bind)
Вы должны избегать подключения к серверу LDAP анонимно из приложения, потому что вы не можете полагаться на конфигурацию сервера. Однако, если у вас есть доступ к серверу, вы можете контролировать доступ к записям, ограничивая доступ. Добавьте эти строки в slapd.conf
доступ к * анонимным авторизатором
Чтобы узнать больше об управлении доступом: https://www.openldap.org/doc/admin24/access-control.html