Отключение доступа уволенным пользователям




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

17 Comments

  1. Fenicss

    Идея хорошая. Прикольно бы было если бы еще на момент отпуска происходило отключение учетной записи для обеспечения безопасности.

    Reply
  2. VBod

    (1) Fenicss, согласен на счет отпуска, было бы удобно. Если безопасность требует, то можно отключать доступ и на время больничного, декретного отпуска и т.п. Хотя мне кажется, что лучше это реализовать регламентным заданием, что бы временное отключение доступа происходило автоматически.

    Reply
  3. e-katerina

    Если сотрудник был уволен и спустя какое-то время снова принят на работу, такой сотрудник не будет считаться уволенным. — Это отлично.

    А как отрабатывается ситуация, когда уволен внутренний совместитель, а по основному месту человек продолжает работать, при этом имеет только 1 учетную запись для входа в программу?

    (2) На счет регламентного отключения — на практике это не всегда удобно, т.к. во время некоторых «и т.п.» человек может продолжать работать.

    Reply
  4. VBod

    (3) e-katerina, ситуация с совместителями также отрабатывается корректно, т.е. пока сотрудник продолжает работать хотя бы по одному место работы, он не будет считаться уволенным.

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

    Reply
  5. Synoecium

    Хорошая идея и, судя по описанию, качественное исполнение 🙂

    Reply
  6. Alex_grem

    Спасибо за обработку, очень выручила

    Reply
  7. VBod

    (6) Alex_grem, всегда пожалуйста, очень рад, что пригодилась.

    Reply
  8. NtS

    возможно сделать подобную обработку для отключения пользователя во всех базах сразу, а не в одной7

    Reply
  9. VBod

    (8) NtS, вы имеете в виду возможность по кадровым данным одной базы, отключать пользователей в других базах, где кадровый учет не ведется? Или пакетное отключение в нескольких базах, но что бы в каждой базе пользователи отключались по кадровым данным той базы, в которой они находятся?

    Reply
  10. help1Ckr

    (9) я о отключении в других базах по кадровым данным одной. Например на предприятии используется 5 систем. Кадровый учет идет только в одной. Приходится заходить и в каждой базе отключать. А так раз — и нету человека)

    Reply
  11. VBod

    (10) help1Ckr, да, такая идея есть. Думаю реализовать ее в будущем, надеюсь, что в ближайшем)

    Reply
  12. VBod

    Может быть у кого-то есть еще предложения по расширению функционала? Буду рад любым идеям)

    Reply
  13. Светлый ум

    Порядок в базе это всегда хорошо +1

    Reply
  14. Evil Beaver

    Гибкость — это, конечно, хорошо, но все же, зачем нужны флажки для отдельного снятия разных типов аутентификации? Какой смысл снимать у уволенного доменную авторизацию, но оставлять при этом парольную? Меня интересует — есть ли прикладной смысл или флажки по видам аутентификации сделаны чисто про запас — а вдруг пригодятся?

    Reply
  15. VBod

    (14) Evil Beaver, скорее про запас). Ну и вдруг пригодится, на случай если при сопоставлении пользователей с физлицами, где в списке присутствуют не только уволенные, заодно понадобиться настроить аутентификацию у некоторых пользователей.

    Reply
  16. Famza

    (0), я бы добавил еще «Запрет на изменение пароля» и «Показывать в списке выбора». Так же на мой взгляд удобно сразу изменить пароль и пометить на удаление. Ведь частенько юзера работают под другими учетками — пресекаем, но все же.

    Reply
  17. yar555

    надёжно быстро и легко — это авторизация в базах по пользователю системы, отключил одним кликом учётку и все, все равно у всех все через rdp

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *