новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Права доступа в УПП. RLS. Общая схема реализации

  • Добавить свою публикацию
  • для этого требуется регистрация

Предисловие

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

Изображение

Сегодня в статье мы рассмотрим общую схему реализации RLS в конфигурации "Управление производственным предприятием" версии 1.3 с позиции разработчика.

Используемые объекты

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

Изображение

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

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

 Обратите внимание на конструкцию "#ИспользоватьОграничениеПоОрганизации". Не трудно догадаться, что при установке флага в ИСТИНА RLS по организациям начинает функционировать. Значение этого флага платформа берет из одноименного параметра сеанса. Вот список параметров сеанса, используемых RLS:

Изображение

Параметр "ИспользоватьОграниченияПравДоступаНаУровнеЗаписей" используется для определения факта использования RLS в базе данных. Обратимся к обработчику инициализации перечисленных параметров сеанса:

 Процедура УстановитьПараметрыМеханизмаОграниченияПравДоступа() Экспорт
	// Получаем флаг использования ограничений на уровне записей
	ПараметрыСеанса.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей 
		= Константы.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей.Получить();
	// Инициализация параметров сеанса 
	Если ПараметрыСеанса.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей Тогда
		
		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
		|	ВидыОбъектовДоступа.Ссылка,
		|	МАКСИМУМ(ВЫБОР
		|			КОГДА ПользователиГруппы.Ссылка ЕСТЬ NULL
		|				ТОГДАИСТИНА
		|			ИНАЧЕВЫБОР
		|				КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа 
		| ЕСТЬ NULL
		|				ТОГДАЛОЖЬ
		|				ИНАЧЕИСТИНА КОНЕЦ
		|		КОНЕЦ)КАК ЕстьОграничение
		|ИЗ
		|	Перечисление.ВидыОбъектовДоступа КАК ВидыОбъектовДоступа
		|		ЛЕВОЕ СОЕДИНЕНИЕ 
		| Справочник.ГруппыПользователей.ПользователиГруппы 
		| КАК ПользователиГруппы
		|		ПО (ПользователиГруппы.Пользователь =&ТекущийПОльзователь)
		|		ЛЕВОЕ СОЕДИНЕНИЕ 
		| РегистрСведений.НазначениеВидовОбъектовДоступа 
		| КАК НазначениеВидовОбъектовДоступа
		|		ПО (НазначениеВидовОбъектовДоступа.ГруппаПользователей 
		| =ПользователиГруппы.Ссылка)
		|		И(НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа =
		| ВидыОбъектовДоступа.Ссылка)
		|
		|СГРУППИРОВАТЬ ПО
		|	ВидыОбъектовДоступа.Ссылка";
		
		Запрос.УстановитьПараметр("ТекущийПользователь", 
								ПараметрыСеанса.ТекущийПользователь);
		Выборка = Запрос.Выполнить().Выбрать();
		ВидыОбъектовДоступаЗначения = 
		          Метаданные.Перечисления.ВидыОбъектовДоступа.ЗначенияПеречисления; 
		Пока Выборка.Следующий() Цикл
			ПараметрыСеанса["ИспользоватьОграничениеПо" + 
			   ВидыОбъектовДоступаЗначения.Получить(
			     Перечисления.ВидыОбъектовДоступа.Индекс(Выборка.Ссылка)
			   ).Имя] = Выборка.ЕстьОграничение;
		КонецЦикла;
		
		
	Иначе
		
		Для Каждого ВидОбъектаДоступа Из 
			 Метаданные.Перечисления.ВидыОбъектовДоступа.ЗначенияПеречисления Цикл			
			ПараметрыСеанса["ИспользоватьОграничениеПо" +
			                        ВидОбъектаДоступа.Имя] = Ложь;			
		КонецЦикла;
		
	КонецЕсли;
	
	УстановитьПараметрСеансаТекущиеУчетныеЗаписиНалогоплательщика();
	
КонецПроцедуры

 Параметр сеанса "ИспользоватьОграниченияПравДоступаНаУровнеЗаписей" устанавливается из одноименной константы. Значения остальных параметров сеанса устанавливаются в соответствии со значениями, установленными для группы текущего пользователя в регистре сведений "НазначениеВидовОбъектовДоступа".

Изображение

Список всех видов объектов доступа представлен в перечислении "ВидыОбъектовДоступа".

Изображение

Настройки прав доступа непосредственно для каждой группы пользователей хранятся в регистре сведений "НастройкиПравДоступаПользователей", в котором указывается "ВидДоступа", "ОбъектДоступа", "ГруппаПользователей" и другие настройки, определяющие возможность выполнять чтение | запись данных. Изменение записей регистра осуществляется обработкой "Настройка прав доступа", которую мы использовали в предыдущей статье.

Использование RLS и, в частности, того или иного вида объекта доступа настраивается с помощью обработки "НастройкиПрограммы" и ее формы "ПараметрыДоступаНаУровнеЗаписей". Вы могли видеть ее в предыдущей статье.

Картина целиком

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

Изображение

 

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

В следующей статье более подробно рассмотрим синтаксис языка запросов RLS в ролях.

 
0
Читайте также
Как обновить 1С 8.2
Для получения доступа к обновлениям конфигураций 1С 8.2 фирма 1С выпускает диски информационно-технического сопровождения (ИТС)
Специализированная конфигурация "Автоапдейтер"
Конфигурация предназначена для автоматического внесения изменений в другие конфигурация 1С 8.Х. Все модули из логируемой кофигурации (Конфигуратор - Конфигурация - Выгрузить файлы конфигурации).
Разработки
Удаленное управление с помощью нашего сервиса
Возможность удаленного управления
Доступ к реквизитам справочника в 1с7.7 для каждого пользователя
Разработка разграничивает доступ к реквизитам справочника в 1С 7.7
Пользователи, права и интерфейсы
Обработка помогает в определении какие права и нтерфейсы дать пользователям
Еще от автора
≡ к списку статей