Приветствую Вас ГостьЧетверг, 16.01.2025, 02:50

Каталог статей


RLS

RLS – Record Level Security

Это чтобы выпендриться...

С определенной версии БСП разделяют на 2 варианта работы ограничением доступа на уровне записей:

  • Стандартный (использовался ранее)
  • Производительный

Стандартный

Ограничения устанавливаются на операции с данными: Чтение, Добавление, Изменение и Удаление. На основные операции накладывать нет смысла, так как они являются частными случаями вышеперечисленных.

Ограничения можно установит на запись целиком или на конкретные поля записи.

Для установки ограничения на запись целиком используется специальное поле "Прочие поля".

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

Например:

В этом случае поля Ссылка, Номер, Дата, ВерсияДанных могут читать все пользователи, а остальные поля только по условию ограничения. Это поможет в том случае, если при обработке одного объекта (например документа) надо обратиться к данным другого объекта (например определить наличие связанного), не зависимо от того, есть у пользователя права или нет. 

Неявное чтение некоторых полей так же выполняется в процессе создания объектов. Например, если установлена автонумерация, то при создании объекта происходит неявное чтение поля Код.

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

Исключить появление ошибки при обращении к запрещенным данным можно также используя в запросах команду "Разрешенные" (динамические списки используют эту команду по умолчанию).

 

Ограничение добавляется при обращении к данным, т.е. к запросу получения данных добавляются условия из ограничения.

Язык ограничений является подмножеством языка запросов. В запросе ограничения доступа к данным всегда присутствует одна таблица в качестве источника данных ‑ это таблица объекта, на который накладывается ограничение (основной объект ограничения).

Особенности языка ограничений:

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

Запись считается доступной, если выполняется условие ограничения или в результате работы условия получается непустая таблица. Если ограничения не установлены, то это равносильно ограничению ГДЕ Истина.

Самый простой вариант установки ограничения первого случая на примере таблицы Контрагенты:

Здесь устанавливается ограничение по наименованию. Ограничения устанавливается на всю запись целиком. Будут выведены только те записи, для которых выполняется условие. 

В условии можно обращаться к полям реквизитов через точку, например:

Контрагенты ГДЕ Контрагенты.Регион.Наименование = "Москва"

Пример установки ограничения второго варианта:

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

Если ограничения установлены для разных ролей пользователя, то они объединяются по ИЛИ.

Инструкции препроцессора

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

#Если <Выражение> #Тогда
#ИначеЕсли <Выражение> #Тогда
#Иначе
#КонецЕсли

Выражения должны иметь тип Булево. В них можно использовать параметры сеанса, обозначать их нужно амперсандом (&Параметр), как и параметры в тексте запроса. 

Если в тексте ограничения используются инструкции препроцессора, то конструктор ограничений не работает.

В языке ограничений используются служебные символы:

& - для обращения к параметрам сеанса и функциональным опциям. Например "ГДЕ Автор = &ТекущийПользователь". Здесь ТекущийПользователь - это параметр сеанса.

# -

  • для инструкций препроцессора (см выше)

  • перед ключевым словом ТекущаяТаблица. Например #ТекущаяТаблица КАК ТекущаяТаблица в ограничении для таблицы Контрагенты равносильно Контрагенты КАК ТекущаяТаблица

  • перед ключевым словом ИмяТекущейТаблицы

  • перед ключевым словом ИмяТекущегоПраваДоступа. Содержит имя права, для которого выполняется текущее ограничение: ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ, УДАЛЕНИЕ

Шаблоны

Шаблоны записываются в свойствах роли на вкладке "Шаблоны ограничений".

В шаблонах символ # также используется:

  • перед ключевым словом Параметр. Например текст шаблона ОграничениеПоАвтору: "ГДЕ #Параметр(1) = &ТекущийПользователь". В ограничении доступа вызов #ОграничениеПоАвтору("Автор"). равносильно вызову ГДЕ Автор = &ТекущийПользователь. Вызов #ОграничениеПоАвтору("Ответственный") равносильно ГДЕ Ответственный= &ТекущийПользователь
  • перед именем параметра шаблона. Означает вставку в текст ограничения соответствующего параметра шаблона.
  • перед символом #. "##" в тексте шаблона равносильно вызову символа "#". Например текст шаблона: ##Если &ИспользоватьОграничениеПоОрганизации ИЛИ ##Тогда ... ##КонецЕсли

Пример использования шаблона в ограничении доступа:

#ОрганизацияПодразделение("Организация", "Подразделение")

пример текста шаблона:

##Если &ИспользоватьОграничениеПоОрганизации ИЛИ &ИспользоватьОграничениеПоПодразделения ##Тогда
ТекущаяТаблица
ИЗ
    #ТекущаяТаблица КАК ТекущаяТаблица
        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
            СоставГруппы.Ссылка КАК ГруппаПользователей
        ИЗ
            Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
        ГДЕ
            СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
        ПО (ИСТИНА)
ГДЕ
НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL
И
    (НЕ 1 В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    1
                ИЗ
                    РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
                                                                
                    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                        ПО
                            НастройкиПравДоступаПользователей.ОбъектДоступа = ВЫБОР
                                    
                                    ##Если &ИспользоватьОграничениеПоОрганизации ##Тогда
                                    КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
                                        ТОГДА ТекущаяТаблица.#Параметр(1)
                                    ##КонецЕсли
                                    
                                    ##Если &ИспользоватьОграничениеПоПодразделения ##Тогда
                                    КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Подразделения)
                                        ТОГДА ТекущаяТаблица.#Параметр(2)
                                    ##КонецЕсли
                                                        
                                КОНЕЦ                               
                
                    И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL))
##КонецЕсли

Рекомендации при разработки ограничений

Рекомендуется проиндексировать реквизиты, которые используются в ограничениях доступа. Это даст возможность СУБД использовать индекс для поиска записей, удовлетворяющих условию ограничения доступа.

Использование нескольких таблиц и соединений в ограничениях доступа приводят к усложнению запроса. Поэтому рекомендуется реквизиты, на которые опирается определение доступности записей, включать в состав самого объекта конфигурации, а не обращаться к ним через точку. Это приведет к хранению избыточной информации, но позволит увеличить скорость выполнения запроса.

На чтение рекомендуется настроить 2 ограничения:

<Прочие поля> - для установки ограничений (запись целиком)

Ссылка, ВерсияДанных, Номер, Дата, (Код, Родитель, Владелец) - без установки ограничений для обеспечения неявного обращения к служебным полям.

Статья на ИТС

Производительный

Об его особенностях можно почитать в статье на ифостарте

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

#Если &ОграничениеДоступаНаУровнеЗаписейУниверсально
#Тогда
#ДляОбъекта("")
#Иначе
... 
#КонецЕсли

ОграничениеДоступаНаУровнеЗаписейУниверсально позволяет определить используется ли производительный вариант

#ДляОбъекта("") - запускает сам механизм.

Чтобы производительный метод работал надо, чтобы в модуле менеджера объекта была процедура 

// СтандартныеПодсистемы.УправлениеДоступом // Позволяет переопределить ограничение, указанное в модуле менеджера объекта метаданных.
// 
// См. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа
//
// Параметры:
// Ограничение - Структура - описание параметра см. УправлениеДоступомПереопределяемый.ПриЗаполненииОграниченияДоступа.Ограничение.
//
Процедура ПриЗаполненииОграниченияДоступа(Ограничение) Экспорт
 
 Ограничение.Текст =
 "РазрешитьЧтениеИзменение
 |ГДЕ
 | ЗначениеРазрешено(Организация)
 | И ЗначениеРазрешено(ПодразделениеОрганизации)";

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

Более подробно о её конструкциях написано в статье.

Если все настроено корректно, то данные о доступе к записям будут храниться в 

  • справочник КлючиДоступа
  • регистр сведений КлючиДоступаКОбъектам
  • регистр сведений КлючиДоступаПользователей

При обращении к данными к запросу будет добавлено обращение к регистру КлючиДоступаКОбъектам с отбором по текущему пользователю, что значительно ускорит процесс.

Данные о доступе обновляются регламентным заданием.

Категория: Администрирование | Добавил: leshic (06.08.2024)
Просмотров: 41 | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт
Поиск
Категории раздела
СКД [50]
Регистры [7]
Формы [47]
Администрирование [41]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [41]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0