Cкрипт деактивации пользователей

[SMPL] - FIM - function deactivateEmployee_2024-01-24 10_43_30.sop (1,4 КБ)

Цель: деактивировать пользователей из экземпляра SimpleOne
На вход нужен массив с sys_id пользователей, которых нужно деактивировать

Скрипт для деактивации пользователей экземпляра

  1. Деактивируем учетную запись в таблице employee
  2. Удаляем Роли сотрудника
  3. Удаляем группы сотрудника
  4. Удаляем токены пользователя

Для удаления нужно раскомментировать строки
//group.deleteMultiple();
//role.deleteMultiple();

// Пример
// в employee_ids  id пользователей из таблицы employee
let employee_ids = [
    '170126461723964096', '169841701223768837', '169823165123881512',
  ]
 
 
function deactivateEmployee(arr) {
  if (!Array.isArray(arr)) {
    ss.addErrorMessage('Ошибка: Входной аргумент не является массивом');
  } else {
    ss.info("Каких пользователей будем удалять:");
    arr.forEach(sys_id => {
      getNameOfDeletedEmployee(sys_id)
      deactivateAccount(sys_id);
      deleteRoles(sys_id);
      deleteGroups(sys_id);
      deleteTokens(sys_id)
    });
  }
}


 
function deactivateAccount(sys_id) {
    const employee = new SimpleRecord('employee');
    let current = employee.get(sys_id);
    current.setValue('active', false);
    current.update();
  }
   
  function deleteRoles(sys_id) {
    const role = new SimpleRecord('sys_user_has_role');
    role.addEncodedQuery(`(user_id.sys_id=${sys_id})`);
    role.query();
    //role.deleteMultiple();
  }
   
  function deleteGroups(sys_id) {
    const group = new SimpleRecord('sys_user_group');
    group.addEncodedQuery(`(user_id.sys_id=${sys_id})`);
    group.query();
    //group.deleteMultiple();
  }
   
  function getNameOfDeletedEmployee(sys_id){
    const employee = new SimpleRecord('employee');
    let current = employee.get(sys_id);
    ss.info(current.email)
  }
   
  function deleteTokens(sys_id){
  const token = new SimpleRecord('user_token')
  token.addEncodedQuery(`(user_id.sys_id=${sys_id})^ORDERBYDESCsys_created_at'`);
  token.setLimit(1);
  token.query();
  //token.deleteMultiple();
   
  while(token.next()){
       ss.info('User: '+ token.user_id.email + " - " + 'last_token_time:'+ token.sys_created_at)
  }}
 
deactivateEmployee(employee_ids);

Прилагаю также sop-файл

9 лайков

Подскажите, почему удаляется только один последний токен из таблицы user_token? Правильно понимаю, что остальные будут по умолчанию просроченными и пользователь не сможет зайти? Он же все равно сможет войти в систему под своим кредам, только из-за удаленных ролей попадет в портал, а признак active = false не влияет на возможность авторизации

1 лайк

Да, сессий может быть много, походу, надо грохать все токены, чтоб “без хвостов”. @ilya.fofanov ?

По опыту - бывают интеграции, которые при перемещении пользователя между позициями или филиалами временно деактивируют аккаунты, а потом активируют. Поэтому я бы делал.

deleteRoles(sys_id);
deleteGroups(sys_id);

не сразу, а через недельку-две (через Scheduled Event ) на тот случай, если пользователя активируют взад. Такой подход защитит и от последствий банальной ошибки (не того деактивировали).

Event Script проверяет, что пользователь все еще деактивирован и выкидывает его из групп, убирает роли. Причем, лучше делать сначала deleteGroups(sys_id); , а потом deleteRoles(sys_id);, т.к. выкидывание из групп уберет роли этих групп от пользователя автоматически (а deleteRoles уберет роли, непосредственно назначенные на пользователя, чего по Best Practice лучше не делать вообще).

С уважением, Никита

Однозначно нужно удалять все токены пользователя.
Во-первых, у пользователя может быть несколько сессий с разных устройств\браузеров.
Во-вторых, у некоторых пользователей автоматически не удаляются просроченные токены (дефект DEF0018097)

В какой версии такое чудо?

1.18.3 точно. Вы можете попробовать деактивировать пользователя на тестовом инстансе и попробовать под ним залогиниться.

На 1.20.1 и 1.21.3 при сброшенном флаге active пользователя в систему не пускает.