gifts2017

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

Опубликовал Дмитрий Колесников (EastGuy) в раздел Администрирование - Защита, права, пароли

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

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

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

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

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

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


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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

 

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

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


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

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

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

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

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

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

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

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

 

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

 

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Проверка временных прав при открытии общей формы
.txt 3,45Kb
09.04.13
60
.txt 3,45Kb 60 Скачать
Открывок функции при записис пользователя
.txt 1,74Kb
09.04.13
16
.txt 1,74Kb 16 Скачать
Проверка временных прав на релгаментированном задании
.txt 3,57Kb
09.04.13
19
.txt 3,57Kb 19 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Денис (1cspecialist) 08.07.11 13:53
маладца, хороший подход
всегда радуют простые и эффективные решения
Андроид; +1 Ответить
2. Андроид (Андроид) 08.07.11 16:26
3. 1 1 (Абыр) 08.07.11 17:10
желательно еще учитывать не только дату завершения, но и дату, с которой будет назначена роль.
просто бывает, что заранее сообщают даты отпуска сотрудника, и сразу роль заместителю не поставишь, потому что сотрудник еще пока работает, а потом можно забыть)
cleaner_it; +1 Ответить
4. Артур Аюханов (artbear) 08.07.11 17:40
(0) Молодец, но почему код как картинка-то?
выложи нормальный код, хотя бы в файлы :(
а лучше Разукрашкой раскрась код и замени картинки на этот код.
Тогда плюсану.
5. Дмитрий Колесников (EastGuy) 08.07.11 19:41
artbear пишет:

(0) Молодец, но почему код как картинка-то?
выложи нормальный код, хотя бы в файлы :(
а лучше Разукрашкой раскрась код и замени картинки на этот код.
Тогда плюсану.


Сори, первая моя публикация и к своему стыду не знаю как нормально выложить код с расскраской. Выложу файлы кода.
6. Артур Аюханов (artbear) 09.07.11 09:28
(5) открываешь сайт, в строке поиска пишешь Разукрашка, первый же вариант открываешь, читаешь, изучаешь, качаешь, юзаешь.
все просто :)
7. Роман Осадченко (cleaner_it) 10.07.11 18:01
Простое и изящное решение!
8. Артем Гусаров (Flashback1979SE) 12.07.11 02:50
отличное решение), выложи одним файлом, плиз
9. Соня V (Sony26) 14.07.11 06:31
Просто супер только не понятно В регисте у роли какой тип будет ????
10. Дмитрий Колесников (EastGuy) 14.07.11 08:13
11. Соня V (Sony26) 14.07.11 11:24
Да у меня тоже Строка.Тогда у меня не выходит в регистр не перезаписывается если я у пользователя другую роль ставлю в регистре остается та которая была раньше. И как работают регламентрые задания ??? Они зависят от конкретного пользователя или сами по себе запускаются ?
12. Соня V (Sony26) 14.07.11 11:40
Выходит надо еще регистр создать Журнал изменений прав пользователей???
13. Соня V (Sony26) 14.07.11 11:42
14. Дмитрий Колесников (EastGuy) 14.07.11 15:03
Вообще у меня есть регистр по изменениям прав доступа, но для этой разработки он не нужен и это совсем другая история - возможно это будет следующая публикация.

Принцип такой: при изменении ролей у пользователя если для роли стоит дата завершения, то для этого пользователя для этой роли делаем запись в регистре сведений (права на регистр только у роли администрирования пользователей). Далее на регламентном задании (пользователь от чьего имени делается не важно для клиент-сервера) проверяет есть ли в регистре записи с датой завершения сегодня и просто удаляет у пользователя эти роли и из регистра сведений.
15. Соня V (Sony26) 15.07.11 03:11
Они же сами должны удаляться при запуске пользователя у которого у данной роли истек срок ??? Или ручками регистр чистить ? Заранее благодарю!
16. Дмитрий Колесников (EastGuy) 15.07.11 05:52
Sony26 пишет:
. Далее на регламентном задании (пользователь от чьего имени делается не важно для клиент-сервера) проверяет есть ли в регистре записи с датой завершения сегодня и просто удаляет у пользователя эти роли и из регистра сведений.


Регистр чистится по регламентному заданию каждое утро - на регламентном задании процедура висит из картинки №5.
yuliya22; +1 Ответить
17. Юлия Юлия (yuliya22) 18.07.11 11:27
У меня такая же тема Бух 8.2 Регламентрые задания не запускаются. Может дело в том что на SQL сервере база. ???
18. Юлия Юлия (yuliya22) 20.07.11 09:22
Все получилось спасибо всем за помошь. Это была проблема в свойствах сервера 1С Предприятия. Там регламентные задания отключаются.
19. Andrey Krapivin (kr_andr) 23.11.11 10:33
20. Kostya Zhurov (It-developer) 21.01.12 12:50
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа