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


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

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

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

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

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

 

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

 

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

20 Comments

  1. 1cspecialist

    маладца, хороший подход

    всегда радуют простые и эффективные решения

    Reply
  2. Андроид

    Мне тоже понравилось. +1

    Reply
  3. Абыр

    желательно еще учитывать не только дату завершения, но и дату, с которой будет назначена роль.

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

    Reply
  4. artbear

    (0) Молодец, но почему код как картинка-то?

    выложи нормальный код, хотя бы в файлы 🙁

    а лучше Разукрашкой раскрась код и замени картинки на этот код.

    Тогда плюсану.

    Reply
  5. EastGuy
    artbear пишет:

    (0) Молодец, но почему код как картинка-то?

    выложи нормальный код, хотя бы в файлы 🙁

    а лучше Разукрашкой раскрась код и замени картинки на этот код.

    Тогда плюсану.

    Сори, первая моя публикация и к своему стыду не знаю как нормально выложить код с расскраской. Выложу файлы кода.

    Reply
  6. artbear

    (5) открываешь сайт, в строке поиска пишешь Разукрашка, первый же вариант открываешь, читаешь, изучаешь, качаешь, юзаешь.

    все просто 🙂

    Reply
  7. cleaner_it

    Простое и изящное решение!

    Reply
  8. Flashback1979SE

    отличное решение), выложи одним файлом, плиз

    Reply
  9. Sony26

    Просто супер только не понятно В регисте у роли какой тип будет ????

    Reply
  10. EastGuy

    Просто строка

    Reply
  11. Sony26

    Да у меня тоже Строка.Тогда у меня не выходит в регистр не перезаписывается если я у пользователя другую роль ставлю в регистре остается та которая была раньше. И как работают регламентрые задания ??? Они зависят от конкретного пользователя или сами по себе запускаются ?

    Reply
  12. Sony26

    Выходит надо еще регистр создать Журнал изменений прав пользователей???

    Reply
  13. Sony26

    А еще у меня то 8.2

    Reply
  14. EastGuy

    Вообще у меня есть регистр по изменениям прав доступа, но для этой разработки он не нужен и это совсем другая история — возможно это будет следующая публикация.

    Принцип такой: при изменении ролей у пользователя если для роли стоит дата завершения, то для этого пользователя для этой роли делаем запись в регистре сведений (права на регистр только у роли администрирования пользователей). Далее на регламентном задании (пользователь от чьего имени делается не важно для клиент-сервера) проверяет есть ли в регистре записи с датой завершения сегодня и просто удаляет у пользователя эти роли и из регистра сведений.

    Reply
  15. Sony26

    Они же сами должны удаляться при запуске пользователя у которого у данной роли истек срок ??? Или ручками регистр чистить ? Заранее благодарю!

    Reply
  16. EastGuy
    Sony26 пишет:

    . Далее на регламентном задании (пользователь от чьего имени делается не важно для клиент-сервера) проверяет есть ли в регистре записи с датой завершения сегодня и просто удаляет у пользователя эти роли и из регистра сведений.

    Регистр чистится по регламентному заданию каждое утро — на регламентном задании процедура висит из картинки №5.

    Reply
  17. yuliya22

    У меня такая же тема Бух 8.2 Регламентрые задания не запускаются. Может дело в том что на SQL сервере база. ???

    Reply
  18. yuliya22

    Все получилось спасибо всем за помошь. Это была проблема в свойствах сервера 1С Предприятия. Там регламентные задания отключаются.

    Reply
  19. kr_andr

    Спасибо

    Reply
  20. It-developer

    Интересная идея

    Reply

Leave a Comment

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