[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Работа с классом
usa_2019
Здравствуйте уважаемые гуру PHP!!!

Так вышло, что на работе приходится переходить с вражеского C# на свободно-распространяемый PHP (халява сэр).
Сильно не бейте, со скриптовыми языками до этого не имел дел от слова совсем.

Вопрос такой: есть класс, который ходит по LDAP в ActiveDirectory и берет данные по конкретному юзеру, создаю экземпляр класса, создаю массив, куда буду пихать данные по пользователям, но каждый раз в массиве идет перезапись всех ранее добавленных данных на последние полученные, объясните как тут работать с переменными, я не понимаю.

<?php

require_once('User.php');

class Ldap {

private $_host;
private $_port;
private $_user;
private $_password;
private $_root_search;
private $_search_attributes;
private $_search_all_groups_attributes;
private $_dn = "";
private $_is_connect;
private $_connection;
private $_search_result;
private $_is_search_flag;
public $_error_message;
private $_ldap_user;

public function __construct() {

$ini_data = parse_ini_file("..\..\config\LDAPConfig.ini", true);

$this->_host = $ini_data["connection"]["host"];
$this->_port = $ini_data["connection"]["port"];
$this->_user = $ini_data["connection"]["user"];
$this->_password = $ini_data["connection"]["password"];
$this->_root_search = $ini_data["search"]["root_search"];
$this->_search_attributes = explode(",", $ini_data["search"]["search_attributes"]);
$this->_search_all_groups_attributes = explode(",", $ini_data["search_all_group"]["search_attributes"]);
$this->_ldap_user = new User();
}

/**
* Функция, которая возвращает флаг подключения к LDAP
*
@param <p>no param</p>
* @return <p>boolean true or </p>
*/
public function connect() {

$this->_connection = ldap_connect($this->_host, $this->_port);
ldap_set_option($this->_connection, LDAP_OPT_REFERRALS, 0);
ldap_set_option($this->_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
$ldap_bnd = ldap_bind($this->_connection, $this->_user, $this->_password);
if ($ldap_bnd) {
$this->_is_connect = true;
} else {
$this->_is_connect = false;
}

return $this->_is_connect;
}
/**
* Функция закрытия подключения к LDAP
*
@param <p>без параметров</p>
* @return boolean _is_connect
*/

public function close(){
if($this->_is_connect){
ldap_close($this->_connection);
$this->_is_connect = false;
}
}


/**
*
* Функция поиска пользователя
*
@param string $login_user логин пользователя
*
@param bool $is_nested флаг, который определяет искать вложенные группы или нет
*
@return array возвращает ассоциированный массив, если code->0, то поиск успешный, если code->-1, то произошла ошибка
* result->User(), если поиск успешный, то возвращается заполненный экземпляр класса User()
*/


public function search_user(string $login_user, bool $is_nested = false) {
$result_array = array();
if ($this->_is_connect) {
$this->_search_result = ldap_search($this->_connection, $this->_root_search, "(&(objectClass=user)(objectCategory=person)(sAMAccountName=" . $login_user . "))", $this->_search_attributes);
$this->_is_search_flag = true;
$this->parse_result($this->_search_result);
if ($this->_ldap_user->message) {
if (!$is_nested) {
$result_array = array("code" => 0, "result" => $this->_ldap_user);
} else {
$this->_search_result = null;
$this->_search_result = ldap_search($this->_connection, $this->_root_search, "(member:1.2.840.113556.1.4.1941:=" . $this->_dn . ")", $this->_search_all_groups_attributes, 0, 0);
$this->parse_nested_group($this->_search_result);
$result_array = array("code" => 0, "result" => $this->_ldap_user);
}
//$this->_user = new User();
} else {
$this->_is_search_flag = false;
$result_array = array("code" => -1, "result" => "Пользователь не найден");
}
}
else {
$this->_is_search_flag = false;
$result_array = array("code" => -1, "result" => ldap_error($this->_connection));
}
$this->_is_search_flag = false;
return $result_array;
}
/**
* Функция обработки результата поиска
*
@param type $seach_result результаты поиска
* если количество найденых записей больше 0, тогда
* получаем все поля класса User. Из конфига берем поля
* которые были найдены в AD.
*
@return boolean проставляется в поле текущего класса $this->_ldap_user->message
* true
*/

private function parse_result(&$seach_result) {
if ($this->_is_connect & $this->_is_search_flag) {
$info = ldap_get_entries($this->_connection, $seach_result);
if ($info["count"] > 0) {
$reflection = new ReflectionClass($this->_ldap_user);
$user_properties = $reflection->getProperties();
foreach ($this->_search_attributes as $key) {

if (strtolower($key) == strtolower("objectSid")) {
$this->_ldap_user->{"objectSid"} = $this->SIDtoString($info[0][strtolower("objectSid")][0]);
} else
if
(strtolower($key) == strtolower("memberOf")) {
$this->_ldap_user->{$key} = $info[0][strtolower($key)];
} else {
$this->_ldap_user->{$key} = $info[0][strtolower($key)][0];
}
}

$this->_ldap_user->message = true;
$this->_dn = $info[0]["dn"];
}
}
}


private function parse_nested_group(&$seach_result) {
if ($this->_is_connect & $this->_is_search_flag) {
$info = ldap_get_entries($this->_connection, $seach_result);
if ($info["count"] > 0) {
$memberOf_nested = array();
array_shift($info);
foreach($info as $item){
array_push($memberOf_nested,$item["name"][0]);
}
$this->_ldap_user->memberOf_nested = $memberOf_nested;
}else{
echo "group not found \n";
}
}
}

/**
* Функция преобразует sid в строку
*
@param binary $ADsid
*
@return string
*/

private function SIDtoString($ADsid) {
$sid = "S-";
//$ADguid = $info[0]['objectguid'][0];
$sidinhex = str_split(bin2hex($ADsid), 2);
// Byte 0 = Revision Level
$sid = $sid . hexdec($sidinhex[0]) . "-";
// Byte 1-7 = 48 Bit Authority
$sid = $sid . hexdec($sidinhex[6] . $sidinhex[5] . $sidinhex[4] . $sidinhex[3] . $sidinhex[2] . $sidinhex[1]);
// Byte 8 count of sub authorities - Get number of sub-authorities
$subauths = hexdec($sidinhex[7]);
//Loop through Sub Authorities
for ($i = 0; $i < $subauths; $i++) {
$start = 8 + (4 * $i);
// X amount of 32Bit (4 Byte) Sub Authorities
$sid = $sid . "-" . hexdec($sidinhex[$start + 3] . $sidinhex[$start + 2] . $sidinhex[$start + 1] . $sidinhex[$start]);
}
return $sid;
}
}


вызов:

$ldap = new Ldap();
$data_array = array();
$ldap->connect();
$data = $ldap->search_user("user1",false);
array_push($data_array,$data);
$data1 = $ldap->search_user("user2",false);
array_push($data_array,$data1);
$ldap->close();
var_dump($data_array);


вывод будет два раза user2
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.