Как изменить имя пользователя, адрес электронной почты или номер телефона в LDAP? - PullRequest
1 голос
/ 16 декабря 2011

У меня есть этот скрипт, с помощью которого я могу изменить свой пароль LDAP, но я также хочу изменить свое имя пользователя или полное имя, адрес электронной почты или номер телефона. Как я могу это сделать? Когда я повторяю записи, я получаю только информацию, такую ​​как мое имя и адрес электронной почты, но что мне нужно сделать, чтобы ldap_modify изменил мое полное имя или номер телефона, адрес электронной почты или идентификатор пользователя?

<?php
$server = "ldap://ldap";
$dn = "ou=People,DC=ssdfg,DC=sadad,DC=com";
$message = array();

function changePassword($server,$dn,$user,$oldPassword,$newPassword,$newPasswordCnf){
  global $message;

  error_reporting(0);

  $con=ldap_connect($server);
  ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);

  $findWhat = array ("cn","mail");
  $findWhere = $dn;
  $findFilter = "(uid=$user)";

  #bind anon and find user by uid
  $sr = ldap_search($con,$dn,$findFilter,$findWhat);
  $records = ldap_get_entries($con, $sr);
   echo "<pre>";print_r($records);
  /* error if found more than one user */
  if ($records["count"] != "1") {
    $message[] = "Error E100 - Wrong user.";
    return false; 
  }else {
    $message[] = "Found user <b>".$records[0]["cn"][0]."</b>";
  }

  /* try to bind as that user */
  if (ldap_bind($con, $records[0]["dn"], $oldPassword) === false) {
    $message[] = "Error E104 - Current password is wrong.";
    return false;
  }
  else { }

  if ($newPassword != $newPasswordCnf ) {
    $message[] = "Error E101 - New passwords do not match! ";
    return false;
  }
  if (strlen($newPassword) < 8 ) {
    $message[] = "Error E102 - Your new password is too short! ";
    return false;
  }
  if (!preg_match("/[0-9]/",$newPassword)) {
    $message[] = "Error E103 - Your password must contain at least one digit. ";
    return false;
  }
  if (!preg_match("/[a-zA-Z]/",$newPassword)) {
    $message[] = "Error E103 - Your password must contain at least one letter. ";
    return false;
  }


  /* change the password finally */
  $entry = array();
  $entry["userPassword"] = "{SHA}" . base64_encode( pack( "H*", sha1( $newPassword ) ) );
  if (ldap_modify($con,$records[0]["dn"],$entry) === false){
    $message[] = "E200 - Your password cannot be change, please contact the administrator.";
  }
  else { 
    $message[] = " Your password has been changed. "; 
    //mail($records[0]["mail"][0],"Password change notice : ".$user,"Your password has just been changed."); 
    } 
}  

?>

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Измените переменную $ findwhat, чтобы в ней была *, и вы получите все атрибуты пользователя, которые может видеть ваша учетная запись, с которой вы выполняете поиск. Обратите внимание, что анонимный пользователь может не видеть много и, конечно, не сможет много обновлять. Мой совет - создать учетную запись в вашем каталоге, которая обладает всеми необходимыми привилегиями, и выполнять все свои операции в соответствии с ней (кроме проверки подлинности, конечно).

Чтобы изменить другие атрибуты, нужно просто включить их в массив $ entry. Вам нужно использовать правильные имена атрибутов, но вы увидите их при распечатке после изменения $ findwhat на *.

Также Apache Directory Studio - хороший бесплатный инструмент для работы с каталогами. Круто в этом то, что вы можете просматривать журналы поиска и модификации и видеть операции ldif, которые он отправляет в каталог. Затем вы можете повторить это в своем коде.

0 голосов
/ 17 декабря 2011

Атрибуты должны запрашиваться, если не используется значение ALL_ATTRIBUTES, часто это звездочка, но не всегда.Сервер каталогов должен позволять клиентам получать значения, и userPassword часто ограничивается пользователями с более широкими правами доступа.

Чтобы изменить значения атрибута, создайте запрос на изменение с выделенным именем, атрибутом и новыми значениями.

Следует отметить несколько моментов:

  • Клиент LDAP должен проверять элементы управления ответом, когда сервер передает ответ на запрос.Отказ от проверки элементов управления ответом может привести к тому, что клиент LDAP, возможно, пропустит важную информацию с сервера
  • Почему эта клиентская база 64 кодирует пароль?Сервер каталогов никогда не должен принимать предварительно закодированные пароли (серверы должны быть настроены так, чтобы отклонять предварительно закодированные пароли), поскольку сервер не может выполнять проверку качества паролей и истории для предварительно закодированных паролей.По этим и другим причинам передача предварительно закодированных паролей является ужасной идеей, и все клиенты должны отказаться от этой практики.Клиенты LDAP должны использовать безопасное соединение (SSL, TLS или ipsec) и передавать пароли в открытом виде или использовать внешний запрос привязки SASL.Для еще большей безопасности используйте расширенный запрос на изменение пароля , который требует существующий пароль и может сгенерировать пароль для пользователя.
  • Этот клиент не может отвечать на нежелательные запросы.уведомление с сервера.Серверы каталогов могут передавать расширенный результат, который является незапрошенным, то есть не в ответ на запрос клиента.Клиенты должны иметь возможность обрабатывать эти уведомления, которые часто являются уведомлениями о том, что сервер отключил клиент по какой-либо причине.

Для получения дополнительной информации см. «LDAP: Практика программирования» .

...