Тестирование прав доступа к объектам с помощью xddTestRunner / Vanessa-ADD

Публикация № 1798879 30.01.23

Разработка - Тестирование QA

Проверка прав доступа пользователей к объектам информационной базы с помощью xddTestRunner / Vanessa-ADD.

- Скажите я имею право?
- Да, имеете.
- А я могу?..
- Нет, не можете.

Посвящается всем тем, кто хоть раз в жизни собирал вручную изменённые RLS при обновлении конфигурации...

Тестировалось на конфигурации Бухгалтерия Предприятия 3.0.127.49.

Одна из основных задач при настройке прав доступа - это обеспечить, чтобы какие-то пользователи видели какие-то данные, а другие их не видели. Например, чтобы пользователи головной организации видели все документы, а пользователи филиала - только документы филиала. Решаются эти задачи с помощью назначения соответствующих ролей и настройки RLS. Проблема же заключается в том, что рано или поздно вся эта грамотно настроенная и доказавшая свою состоятельность на практике система прав доступа, мягко говоря, идёт к коту под хвост. Причины могут быть самые различные. Но, пожалуй, самая частая связана с обновлением конфигураций. Где-то в правах что-то добавилось типовое, где-то что перетёрлось нетиповое - и всё, начинается "ужас-ужас! тот кто не надо увидел то, что не надо!". Разумеется, грамотное проектирование доработок конфигурации значительно уменьшает подобные риски (а иногда и вовсе их исключает), но в любом случае, перед установкой новой конфигурации на рабочий сервер, обычно хочется убедиться, что права "не съехали".

Сразу оговорюсь, предлагаемый тут вариант - это не универсальное средство, а всего лишь ещё один дополнительный эшелон для защиты от ошибки.

Итак, приступим. Будем решать следующую упрощённую (но при этом вполне реальную) задачу: в организации применяется политика, согласно которой пользователи головной организации должны иметь полный доступ ко всем документам, а пользователи филиала - только доступ к документам филиала. Нам нужно проверить выполняется ли эта политика на практике. 

Предлагаемый вариант решения такой: раз нужно проверить выполняется ли на практике, значит и проверять будем тоже на практике. Т.е. возьмём какого-нибудь пользователя головной организации (с достаточными правами, но без полных прав; например, это может быть ГБ или зам.ГБ), и попробуем под ним прочитать/записать/создать документы и головной организации, и филиала. И это должно у него получиться. А потом возьмём пользователя филиала, и попробуем под ним прочитать/записать/создать документы филиала (это у него должно получиться!), а также прочитать/записать/создать документы головной организации (а это не должно у него получиться!).

 
 Полный код модуля обработки тестирования

 

Как театр начинается с вешалки, так и файл тестов xddTestRunner начинается с процедуры ЗаполнитьНаборТестов(). В ней мы определяем, что наш тестовый пользователь с именем "ПользовательГоловной" принадлежит к головной организации, а тестовый пользователь "ПользовательФилиала" - к филиалу. Далее перебираем все документы в метаданных, пропускаем те из них, которые начинаются с "Удалить", и создаём тесты. В параметрах теста передаем имя проверяемой таблицы (например, "Документ.СчетНаОплатуПокупателю"), вид проверяемых прав ("чтение"/"запись"/"создание") и фильтр для отбора какого-то конкретного документа для проверки есть к нему доступ у пользователя или нет (в нашем случае это будет фильтр по Организации).

У данного файла-теста есть всего два метода:

  • Процедура ТестДолжен_ПроверитьЕстьДоступ() - для проверки что у пользователя есть доступ к объектам с указанным видом прав
  • и Процедура ТестДолжен_ПроверитьНетДоступа() - для проверки, что у пользователя нет доступа.

Методы тривиальны. На входе получают параметры теста (см. выше), а внутри с помощью вызова функции ПолучитьСсылкуНаОбъект() получают ссылку на какой-нибудь объект информационной базы и через процедуры ПроверитьЕстьДоступКДанным()/ПроверитьНетДоступаКДанным() проверяют есть ли у пользователя доступ к этому объекту.

Функция ПолучитьСсылкуНаОбъект() тоже весьма незамысловата. Она возвращает первую попавшуюся ссылку на объект БД из таблицы, переданной в параметре ИмяТаблицы (например, "Документ.СчетНаОплатуПокупателю") и с отборами, переданными в структуре Фильтр (в текущей версии функции работают только сравнения на равенство). 

Единственный момент, над которым пришлось задуматься - это использовать или не использовать в функции ПолучитьСсылкуНаОбъект() в запросе ключевое слово "РАЗРЕШЕННЫЕ". В текущем варианте решил не использовать. Дело в том, что если использовать "РАЗРЕШЕННЫЕ", то в процедуре ТестДолжен_ПроверитьЕстьДоступ() при вызове

СсылкаНаОбъект = ПолучитьСсылкуНаОбъект(ИмяТаблицы, Фильтр);

вернётся пустое значение. Как-будто в базе нет объектов такого типа. Хотя на самом деле они могут там быть, просто у пользователя нет к ним доступа. Решил, что всё-так не буду писать "РАЗРЕШЕННЫЕ". В связи с этим в методе ТестДолжен_ПроверитьНетДоступа() вызов функции ПолучитьСсылкуНаОбъект() пришлось обернуть в Попытка ... Исключение (т.к. запрос без слова "РАЗРЕШЕННЫЕ" генерирует исключение "Нет прав доступа" в случае, если у пользователя нет прав на чтение данных из БД):

	Попытка
		СсылкаНаОбъект = ПолучитьСсылкуНаОбъект(ИмяТаблицы, Фильтр);
	Исключение
		// всё ок, не смогли получить
	    Возврат;
	КонецПопытки;

Вообще, я исхожу из того, что пусть лучше будут ложноположительные срабатывания, чем ложноотрицательные. Пусть лучше тест покажет, что есть ошибка там, где её на самом деле нет, чем покажет, что ошибки нет там, где она на самом деле есть.

Ну и, наконец, сами процедуры проверки наличия или отсутствия прав доступа к конкретному объекту БД:

  • Проверка наличия доступа на чтение осуществляется через вызов ПолучитьОбъект() для ссылки на объект БД.
  • Проверка наличия доступа на запись осуществляется через ПолучитьОбъект() + Записать().
  • Проверка наличия доступа на создание нового осуществляется через копирование существующего объекта, ситуативного дозаполнения (например, установки даты документа) и записи. 
Процедура ПроверитьЕстьДоступКДанным(СсылкаНаОбъект, ВидПрав)

	Если ВидПрав = "чтение" Тогда
		ОбъектБД = СсылкаНаОбъект.ПолучитьОбъект();
	ИначеЕсли ВидПрав = "запись" Тогда
		ОбъектБД = СсылкаНаОбъект.ПолучитьОбъект();
		ОбъектБД.Записать();
	ИначеЕсли ВидПрав = "создание" Тогда
		НовыйОбъект = СсылкаНаОбъект.Скопировать();
		Если Метаданные.Документы.Содержит(НовыйОбъект.Метаданные()) Тогда
			НовыйОбъект.Дата = ТекущаяДатаСеанса(); //у некоторых документов почему-то не заполняется автоматически дата, поэтому заполним её явно
		КонецЕсли;
		НовыйОбъект.Записать();
	КонецЕсли;

КонецПроцедуры

Проверка на отсутствие доступа сделана через "инверсию" проверки на наличие доступа. Т.е. вызываем процедуру ПроверитьЕстьДоступКДанным() и смотрим. Если было вызвано исключение, считаем, что это случилось из-за того, что у пользователя нет прав доступа. Если же исключения не было, значит ПроверитьЕстьДоступКДанным() отработала без ошибок и у пользователя есть доступ к данным.

Процедура ПроверитьНетДоступаКДанным(СсылкаНаОбъект, ВидПрав);
	
	БылоИсключение = Ложь;
	
	Попытка
		ПроверитьЕстьДоступКДанным(СсылкаНаОбъект, ВидПрав);
	Исключение
	    БылоИсключение = Истина;
	КонецПопытки;
	
	Если НЕ БылоИсключение Тогда
		ВызватьИсключение "У пользователя есть права на """ + ВидПрав + """, хотя их быть не должно!";
	КонецЕсли;
	
КонецПроцедуры

Про файл теста вроде бы и всё.

 

Теперь про методику тестирования.

Этап 1. Подготавливаем пользователя головной организации (в нашем примере, это пользователь с именем "ПользовательГоловной", но рекомендуется проверять под каким-то реальным пользователем!), заходим под ним в базу, запускаем тест в xddTestRunner, анализируем результаты.

Этап 2. Подготавливаем пользователя филиала, заходим под ним в базу (в нашем примере, это пользователь с именем "ПользовательФилиала", но рекомендуется проверять под каким-то реальным пользователем!), заходим под ним в базу, запускаем тест в xddTestRunner, анализируем результаты.

Как видите, тут тоже без неожиданностей и пасхалочек. Единственный момент, который надо прояснить - это как "подготовить пользователя". Дело в том, что для корректной работы xddTestRunner и этого теста необходимо учесть определённые моменты, такие как:

  • наличие у пользователей ролей Администрирование (не путать с "полными правами"!) и ИнтерактивноеОткрытиеВнешнихОтчетовИОбработок - иначе xddTestRunner просто не запустится,
  • отключение у пользователя предупреждений об опасных действиях,
  • отключение у пользователя доменной аутентификации и установка ему известного вам пароля,
  • перенос/отключение даты запрета редактирования для этого пользователя,
  • обновление нумерации объектов (да-да! чтобы не получилось так, что запустили тест, прождали полчаса-час пока он выполняется, а в конце увидели протокол, в котором написано, что значительная часть тестов упала, потому что "не удалось записать, т.к. номер объекта не уникальный"),
  • и т.п.

Справиться со всем этим (точнее, почти со всем) поможет обработка, на форме которой есть реквизиты Логин (тип = строка), Пароль (тип = строка), ИмяТестовогоСервера (тип = строка; нужна чтобы случайно не запустить на рабочем сервере!), УстановитьПароль (тип = булево; признак нужно или не нужно устанавливать пароль для пользователя), ОбновитьНумерацию (тип = булево; признак нужно или нет обновлять нумерацию объектов), и вызывающая следующую функцию:

 
 Подготовка пользователя для тестирования

Запускать это нужно, разумеется, под администратором.

Вот теперь совсем всё. Весь приведённый исходный код доступен под лицензией Mozilla Public Licence 2.0 (для совместимости с проектом Vanessa-ADD).

Ну и, конечно, пользуясь случаем, хочу ещё раз выразить благодарность всем разработчикам Vanessa-ADD. Отличный инструмент, выручает регулярно. Спасибо!

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

Наименование Файл Версия Размер
Тестирование прав доступа к объектам с помощью xddTestRunner / Vanessa-ADD:

.7z 9,72Kb
1
.7z 9,72Kb 1 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. RustIG 1691 30.01.23 09:40 Сейчас в теме
(0) 1. Способ применяется не только при использовании тестовых программ, но и при обычной отладке кода - пишется внешняя обработка, которая запускает создание/изменение/чтение/удаление/проведение любого справочника/документа/регистра/др.объектов.
Я в свое время делал глобальную доработку видимости по подразделениям и запускал универсально: бежал по объектам метаданных документов: открывал список документов...

2. Права доступа - это ведь не только права на чтение/изменение/и т.д., но настройка видимости/доступности записей/полей/списков/и т.д. - чтобы, например, не видеть в журнале документов "объект не найден". Кто-то скажет, что это РЛС-настройка, я же скажу, что это больше чем РЛС. Тут еще надо прописывать логику видимости/доступности для разных условий/сценариев.
3. q_i 549 30.01.23 11:33 Сейчас в теме
1. Ну вот - теперь такая обработка не только написана, но ещё и в общем доступе. )) В ней можно задать любую свою логику контроля прав в ЗаполнитьНаборТестов(), т.е. прописать там какому пользователю что можно, а что нельзя, и после этого подёргать за ТестДолжен_ПроверитьЕстьДоступ()/ТестДолжен_ПроверитьНетДоступа().
2. Согласен, что тема значительно шире, чем она раскрыта в данной публикации. Но нельзя объять необъятное, поэтому я взялся за то, что, как мне кажется, нужно проконтролировать в первую очередь. В конце концов, если выбирать между вариантом, что пользователь увидит "объект не найден" и вариантом, что он увидит сам объект во всём своём великолепии, то очевидно, что второй вариант куда более неприятен и чреват негативными последствиями.
2. artbear 1429 30.01.23 10:34 Сейчас в теме
(0) Полезное применение Vanessa-ADD.
Борьба с правами - это боль!
Уже есть несколько дымовых тестов из Ванесса-АДД, которые также проверяют права, но их недостаточно и тесты из статьи явно будут полезны!

И от лица разработчиков Vanessa-ADD спасибо за его использование и публикацию статьи с примерами использования!
4. siamagic 17.02.23 07:09 Сейчас в теме
(2)Вы точно программист? Эта задача для студентов, делается на коленке, никакие фрейморвки левые тут не нужны.
Оставьте свое сообщение

См. также

Диагностика формирования QR-кода в БП 3.0

Тестирование QA Платформа 1С v8.3 1С:Бухгалтерия 3.0 Россия Абонемент ($m)

Внешняя обработка для конфигурации «1С: Бухгалтерия предприятия 8» (ред.3.0), обеспечивающая оперативную диагностику формирования QR-кода при печати документов с целью выявления причин возникающих ошибок, а также проверки платежных реквизитов, содержащихся в сформированном QR-коде.

2 стартмани

16.12.2022    1426    2    infotec    0    

4

Автоматизированное тестирование 3 в 1 (загрузка, подключение, кодогенерация)

Инструментарий разработчика Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Новый инструмент тестирования с возможностью подключиться к ИБ, загрузить файл *.DT с копией информационной базы, генерировать код и проверить сценарий с помощью шлюза тестирования. Полезен тестировщикам и программистам 1С.

3 стартмани

02.12.2022    2789    7    ZhokhovM    0    

14

Генератор сценариев тестирования для Vanessa Automation

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Нет новых генераторов сценария тестирования для Vanessa Automation? Нужна простенькая обработка? Vanessa Automation самый лучший инструмент тестирования? Тогда вам сюда!

2 стартмани

17.11.2021    5930    11    ZhokhovM    27    

8

Vanessa Automation, или как начать писать свои тесты за 5 минут

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Статья рассчитана на новичков, которые либо вообще не писали тесты, либо только начинают или хотят их написать. Читай далее - будет интересно!

1 стартмани

21.08.2021    21919    22    Xershi    36    

72

Тестирование проводок в ЕРП и КА

Тестирование QA Платформа 1С v8.3 1С:ERP Управление предприятием 2 Россия Бухгалтерский учет Абонемент ($m)

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

1 стартмани

02.09.2020    8531    39    JohnConnor    7    

9

Генерация сценариев тестирования внешних печатных форм средствами Vanessa Automation

Тестирование QA Платформа 1С v8.3 1С:ERP Управление предприятием 2 Абонемент ($m)

Предложен способ автоматической генерации сценариев для тестирования внешних печатных форм средствами Vanessa Automation

1 стартмани

15.06.2020    9909    2    ipoloskov    5    

36

Технология создания эффектных видео-инструкций посредством DevTools Protocol

Тестирование QA Платформа 1С v8.3 Россия Абонемент ($m)

Конфигурация демонстрирует применение технологий интеграции 1C с браузером Google Chrome для создания эффектных видео-инструкций при помощи инструментов сценарного тестирования. Поддерживаются все версии платформы от 8.3.10 и выше до 8.3.17.

1 стартмани

18.04.2020    9400    4    kandr    3    

45

СППР. Интерактивный запуск дерева процессов

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение для СППР (система проектирования прикладных решений ред. 2.0.1.58) позволяющее запускать фреймворк тестирования Vanessa Automation не только с текущим процессом, но и с предшествующими ему.

1 стартмани

23.03.2020    6097    2    check2    2    

12

А вы как запускаете режим отладки в 1с?

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Решил рассказать о своём способе входа в конфигуратор для отладки алгоритмов пользователем, не имеющим прав входа в конфигуратор. За первую редакцию статьи словил минусов, что меня подвигло изучить данный вопрос.

1 стартмани

14.08.2017    14100    2    agent00mouse    8    

0

Автоматическое формирование отчета по качеству кода, используя конфигурацию "Автоматизированная проверка конфигураций"

DevOps и автоматизация разработки Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Обработка позволяет создавать отчет по качеству кода в автоматическом режиме на сервере сборок Jenkins, используя конфигурацию "Автоматизированная проверка конфигураций"

1 стартмани

06.02.2017    7293    7    aleksey_vk    2    

8

Простой запуск юнит-тестов

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Шаблон экспресс теста на базе xUnitFor1C

1 стартмани

28.01.2017    17679    4    json    2    

11

Тестирование сервиса Yandex SpeechKit Cloud API

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Обработка, позволяющая поэкспериментировать с сервисом синтеза и распознавания речи SpeechKit Cloud API от Yandex.

1 стартмани

18.05.2015    22247    85    Boneman    20    

21

Написание простой обработки через тестирование

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Раньше я считал, что в 1С невозможно юнит-тестирование (ведь тут нет вездесущих объектов, привычных классов и и. т.). Иногда на Инфостарте появлялись специализированные обработки, но часто они скорее отпугивали от темы тестирования, чем привлекали к ней. Потом я узнал про xUnitFor1C. Оказалось, что тестирование в 1С в общем не так уж и сложно, даже в сравнении с другими языками. В данной статье я расскажу о своем первом опыте.

1 стартмани

24.02.2015    34431    20    Alien_job    40    

78

Тестирование форм конфигурации

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Внешняя обработка для тестирования форм конфигурации

1 стартмани

05.05.2014    17194    19    dour-dead    1    

5

Универсальное тестирование работоспособности конфигурации

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Обработка автоматически тестирует некоторые действия всех объектов конфигурации (запись, проведение, открытие форм, печать и др.) Подходит для тестирования любой конфигурации. Если допущены ошибки в печатных формах, процедурах записи или проведения, обработка отобразит их.

1 стартмани

20.09.2012    8218    163    intrata    18    

34

Тестирование регулярных выражений

Тестирование QA Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

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

1 стартмани

21.01.2011    23844    216    salexdv    27    

63