Предоставление и мониторинг временных прав доступа (ролей)


Механизм храниния и автоматического сбора информации по временным правам доступа с анулированием и восстановлением по дате.

Работаем в УПП, пользователей более 300 (активных 70-80) и достаточно часто для пользователей предоставляются роли доступа на временной основе - временное исполнение обязанностей - больничный или отпуск кого-либо, временные работы и т. д. Отслеживать это руками и делать себе напоминалки надоело и решил автоматизировать этот процесс.

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

Создаем регистр сведений, в котором будем хранить информацию по пользователю, временной роли, когда ее нужно убрать и когда восстановить, если такие есть. Регистр не периодический и независимый - ВременныеПраваДоступа.

В общей форме "ФормаПользователяИБ" в таблицу с ролями добавляем колонку с датой завершения, в которой мы будем вносить нашу дату для временной роли. А также колонку с датой возврата роли.

При открытии формы у нас проверяется есть ли для данного пользователя временные права доступа и проставляем в таблицу:


    ПоказыватьВСпискеВыбора = ПользовательНастроек.ПоказыватьВСпискеВыбора;
   
АутентификацияОС = ПользовательНастроек.АутентификацияОС;

   
Запрос = Новый Запрос;
   
Запрос.УстановитьПараметр("Пользователь", Пользователь.Ссылка);

   
Запрос.Текст = "ВЫБРАТЬ
                   |    ВременныеПраваДоступа.Роль,
                   |    ВременныеПраваДоступа.ДатаЗавершения,
                   |    ВременныеПраваДоступа.ДатаВозврата
                   |ИЗ
                   |    РегистрСведений.ВременныеПраваДоступа КАК ВременныеПраваДоступа
                   |ГДЕ
                   |    ВременныеПраваДоступа.Пользователь = &Пользователь"
;

   
Результат    = Запрос.Выполнить();

   
ТаблицаРолей = Результат.Выгрузить();

    Для Каждого
СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
       
СтрокаСпискаДоступныхРолей.Пометка = ПользовательНастроек.Роли.Содержит(СтрокаСпискаДоступныхРолей.Значение);

       
НайденнаяСтрока = ТаблицаРолей.Найти(СтрокаСпискаДоступныхРолей.Значение.Имя, "Роль");
        Если
НайденнаяСтрока <> Неопределено Тогда
           
СтрокаСпискаДоступныхРолей.ДатаЗавершения = НайденнаяСтрока.ДатаЗавершения;
           
СтрокаСпискаДоступныхРолей.ДатаВозврата   = НайденнаяСтрока.ДатаВозврата;
        КонецЕсли;
    КонецЦикла;

 

При раздаче прав должны напротив временной роли установить дату снятия это роли с пользователя, а для убираемой роли снять галочкуи поставить дату возврата. В функции "ЗаписатьПользователя" вставляем несколько строк - привожу отрывок кода с моей вставкой:

 

    // Роли сохраняем
   
Для Каждого СтрокаСпискаДоступныхРолей Из СписокДоступныхРолейПользователяИБ Цикл
       
мРоль = СтрокаСпискаДоступныхРолей.Значение;

       
СодержитРоль = ПользовательИБ.Роли.Содержит(мРоль);

        Если
СодержитРоль И Не СтрокаСпискаДоступныхРолей.Пометка Тогда
           
ПользовательИБ.Роли.Удалить(мРоль);
        ИначеЕсли Не
СодержитРоль И СтрокаСпискаДоступныхРолей.Пометка Тогда

           
ПользовательИБ.Роли.Добавить(мРоль);
            Если
ЗначениеЗаполнено(СтрокаСпискаДоступныхРолей.ДатаЗавершения) Тогда
               
НаборЗаписей = РегистрыСведений.ВременныеПраваДоступа.СоздатьНаборЗаписей();
               
НаборЗаписей.Отбор.Пользователь.Установить(Пользователь.Ссылка);
               
НаборЗаписей.Отбор.Роль.Установить(мРоль.Имя);
               
НаборЗаписей.Отбор.ЭтоВозврат.Установить(Ложь);

               
Запись = НаборЗаписей.Добавить();
               
Запись.Пользователь   = Пользователь.Ссылка;
               
Запись.Роль           = мРоль.Имя;
               
Запись.ДатаЗавершения = СтрокаСпискаДоступныхРолей.ДатаЗавершения;
               
НаборЗаписей.Записать();
            КонецЕсли;
        КонецЕсли;

        Если
ЗначениеЗаполнено(СтрокаСпискаДоступныхРолей.ДатаВозврата) Тогда
           
НаборЗаписей = РегистрыСведений.ВременныеПраваДоступа.СоздатьНаборЗаписей();
           
НаборЗаписей.Отбор.Пользователь.Установить(Пользователь.Ссылка);
           
НаборЗаписей.Отбор.Роль.Установить(мРоль.Имя);
           
НаборЗаписей.Отбор.ЭтоВозврат.Установить(Истина);

           
Запись = НаборЗаписей.Добавить();
           
Запись.Пользователь   = Пользователь.Ссылка;
           
Запись.Роль           = мРоль.Имя;
           
Запись.ЭтоВозврат     = Истина;
           
Запись.ДатаВозврата   = СтрокаСпискаДоступныхРолей.ДатаВозврата;
           
НаборЗаписей.Записать();
        КонецЕсли;
    КонецЦикла;

 

Теперь надо нам проверять на регулярной основе есть ли у нас неубуранные временные права и убирать их, а также восстанавливать те роли, по которым настала дата возврата, очищая регистр по этим пользователям и ролям. Создадим простое регламентированное задание и повесим на него процедуру:

 И каждую ночь у меня отрабатывает это задание, убирая временные права и восстанавливая временно запрещенные.


    Запрос = Новый Запрос;

   
//Завершаем права
   
Запрос.Текст = "ВЫБРАТЬ
                   |    ВременныеПраваДоступа.Пользователь,
                   |    ВременныеПраваДоступа.Роль,
                   |    ВременныеПраваДоступа.ЭтоВозврат
                   |ИЗ
                   |    РегистрСведений.ВременныеПраваДоступа КАК ВременныеПраваДоступа
                   |ГДЕ
                   |    (ВременныеПраваДоступа.ДатаЗавершения 
                   |    И ВременныеПраваДоступа.ДатаВозврата = &ПустаяДата)
                   |    ИЛИ (ВременныеПраваДоступа.ДатаВозврата 
                   |    И ВременныеПраваДоступа.ДатаЗавершения = &ПустаяДата)"
;

   
Запрос.УстановитьПараметр("ДатаЗапроса", ТекущаяДата());
   
Запрос.УстановитьПараметр("ПустаяДата" , Дата('00010101'));

   
Результат = Запрос.Выполнить();

   
Выборка   = Результат.Выбрать();

   
Период = ТекущаяДата();
    Пока
Выборка.Следующий() Цикл
       
ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоИмени(СокрЛП(Выборка.Пользователь.Код));
        Если
Выборка.ЭтоВозврат Тогда
           
ПользовательИБ.Роли.Добавить(Метаданные.Роли[Выборка.Роль]);
        Иначе
            Если
ПользовательИБ.Роли.Содержит(Метаданные.Роли[Выборка.Роль]) Тогда
               
ПользовательИБ.Роли.Удалить(Метаданные.Роли[Выборка.Роль]);
            КонецЕсли;
        КонецЕсли;
       
ПользовательИБ.Записать();

       
НаборЗаписей = РегистрыСведений.ВременныеПраваДоступа.СоздатьНаборЗаписей();
       
НаборЗаписей.Отбор.Пользователь.Установить(Выборка.Пользователь);
       
НаборЗаписей.Отбор.Роль.Установить(Выборка.Роль);
       
НаборЗаписей.Отбор.ЭтоВозврат.Установить(Выборка.ЭтоВозврат);

       
НаборЗаписей.Прочитать();
       
НаборЗаписей.Очистить();
       
НаборЗаписей.Записать();
    КонецЦикла;

 

Теперь я не пишу напоминалки чтобы убрать временные права и все работает "на ура" - главное правильно раздавать права.

 

Надеюсь кому-то будет полезна.

Файлы обработки:

-