Пользователи и роли
Пользователи
Для пользователя задается Имя, Полное имя и адрес электронной почты. На вкладке Дополнительно указываются роли.
Для данных профиля этих полей может быть мало, поэтому используют следующую схему: создается справочник (например Пользователи), в нем указывают необходимые реквизиты. Могут быть дополнительные элементы. Один из реквизитов (обычно Наименование) на уровне сравнения строк должен соответствовать Имени пользователя. Затем создаются важные для решения задачи параметры сеанса, в которые при авторизации сохраняются
Роли
После добавления роли, нужно обновить БД клавишей F7 чтобы роль отобразилась в списке ролей пользователей.
Ролевая модель доступа. Роли независимые, один уровень. Иерархии ролей нет. У одного пользователя может быть несколько ролей. При нескольких ролях у пользователя приоритет разрешения. Если хотя бы в одной роли есть разрешение, то доступ будет разрешен, если во всех ролях есть запрещение, то доступ будет запрещен.
Роли можно копировать для упрощения настроек.
&НаСервере
Процедура ПросмотретьРолиПользователяСервер()
СписокРолей = Новый Массив;
Роли = ПользователиИнформационнойБазы.ТекущийПользователь().Роли;
Для каждого роль из роли цикл
Сообщить(роль.Имя);
КонецЦикла
КонецПроцедуры
Права доступа могут настраиваются с точностью до записи базы данных (например у одного пользователя может быть доступ к одним записям справочника Контрагенты, у другого - к другим), В рамках формы настройка прав до уровня доступа к реквизитам, т е могут быть права на редактирование названия, но прав на редактирование табличной части может не быть.
Все права делятся на основные и интерактивные. Основные права (чтение, добавление, изменение, удаление): это разрешения на действия, выполняемые над элементами данных системы или над всей системой в целом, и проверяются независимо от способа обращения к данным. Интерактивные права: это разрешения на действия, выполняющиеся пользователем интерактивно. Проверяются при выполнении интерактивных операций стандартными способами. В клиент-серверном варианте проверкиа основных прав выполняюется на сервере, интерактивных на клиенте.
Проверку интерактивных прав доступа можно обойти, если создать в конфигураторе собственную форму объекта и заменить стандартные команды собственными. Проверку основных прав обойти нельзя. Допускается установка основного права и сброс интерактивного, но не наоборот.
Основные и интерактивные права взаимосвязаны. ВЦелостность взаимныех связией отслеживаюется системой автоматически, при установке подчиненного права устанавливаются родительские, при снятии родительского удаляются все подчиненные.
Иерархия прав
На уровне корневого элемента всей конфигурации устанавливается набор прав, определяющих для роли каким клиентским приложениям разрешен доступ к базе, разрешен ли доступ к журналу регистрации и т.д.
Неявное использование прав доступа и ускорение работы
Если необходимо часть действий выполнять без учета установленных ограничений, а полные права на эти объекты давать из соображений безопасности не стоит, следует вынести эти действия в привилегированные модули или явно включать и выключать привилегированный режим в соответствующих местах программного кода.
Объекты конфигурации могут выполнять обращения к некоторым полям базы данных неявно. При этом наложение
ограничений доступа выполняется способом «все», что может приводить к неожиданным сообщениям о нарушении прав доступа. Поэтому ограничивать доступ к таким полям нельзя.
Включение автонумерации или контроля уникальности номеров объектов приводит к неявному чтению поля Код (для документов, бизнес процессов и задач – Номер) при создании нового объекта и при его записи. Если в справочниках в качестве серии кодов выбрано «в пределах подчинения», то происходит неявное чтение полей Код, Родитель. Если используется иерархия групп и элементов, то кроме этого неявно считывается поле ЭтоГруппа. При выборе в качестве серии кодов «в пределах подчинения владельцу» неявно будет выполняться чтение полей Код и Владелец.
Если при записи документа, бизнес-процесса или задачи установлен режим автоматического определения времени, то при записи будет неявно выполняться чтение полей Дата и Ссылка. Поэтому чтение полей Дата и Ссылка должно быть разрешено.
Также рекомендуется проиндексировать реквизиты, которые используются в ограничениях доступа. Ускорение работы с использованием индексов достигается за счет того, что индекс имеет структуру, оптимизированную под поиск, например, сбалансированного дерева. Но индексы занимают дополнительный объем памяти, поэтому перед созданием индекса следует убедиться, что планируемый выигрыш в производительности запросов превысит дополнительную затрату ресурсов компьютера на поддержание индекса.
Использование нескольких таблиц и соединений в ограничениях доступа приводят к усложнению запроса. Поэтому рекомендуется реквизиты, на которые опирается определение доступности записей, включать в состав самого объекта конфигурации, а не обращаться к ним через точку. Это приведет к хранению избыточной информации, но
позволит увеличить скорость выполнения запроса.
Ограничения доступа на уровне записей базы данных
Использовать в случае крайней необходимости!
Механизм RLS (Record Level Security). Нагружает систему дополнительными запросами.
Настраивается только для основных прав. Для регистров накопления, бухгалтерского учета и расчета условия позволяют разграничить доступ по значениям измерений (для регистров бухгалтерского учета по балансовым измерениям), а для объектных данных и регистров сведений условия позволяют разграничивать доступ к данным по любым полям.
Для операций изменения, добавления и удаления можно задать только одно условие, а для операции чтения можно задать несколько ограничений доступа на уровне записей.
Способы настройки ограничений:
<Прочие поля> | Конкретное имя поля | |
Способ установки ограничения | На всю запись | На отдельное поле записи |
Использование при запросе | Будет накладываться для всех полей объекта, кроме полей, для которых ограничения заданы явным образом | Условие будет накладываться только в том случае, если в запросе присутствует поле, для которого задано ограничение |
Данные могут быть выбраны из базы запросом или при помощи объектной техники. При использовании объектного чтения объект всегда будет считан из базы целиком. При использовании запроса есть возможность явно указать только необходимые поля, поэтому если в запрос не попадут поля с ограничениями, то данные записей будут предоставлены. Есть дополнительная деталь. Существует два способа функционирования ограничений доступа:
- Все. Операция должна быть выполнена над всеми подразумеваемыми данной операцией объектами базы данных. Если при выполнении такой операции должны быть прочитаны или изменены объекты базы данных, для которых не выполняются соответствующие ограничения доступа, то операция завершается аварийно из-за нарушения прав доступа
- Разрешенные. При выполнении операции над данными должны быть прочитаны только те объекты базы данных, которые удовлетворяют соответствующим ограничениям доступа. Объекты базы данных, не удовлетворяющие ограничениям доступа, при выполнении такой операции считаются отсутствующими и на результат операции не влияют.
При отображении динамических списков используется способ «Разрешенные», а при получении объектов средствами встроенного языка и при записи объектов в базу данных применяется способ «Все». В запросах способом функционирования ограничений можно управлять. Если в тексте запроса используется ключевое слово РАЗРЕШЕННЫЕ, то работа ограничений выполняется в соответствии с одноименным способом, в противном случае используется способ «Все».
Пример отличия в исполнении запроса в режиме ВСЕ и в режиме РАЗРЕШЕННЫЕ. В таблице есть поле Контрагенты, на него установлено ограничение на наименование. Есть и как записи с данным неименованием, так и
Текст первого запроса:
ВЫБРАТЬ
Контрагенты.Наименование КАК Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
Текст второго запроса
ВЫБРАТЬ РАЗРЕШЕННЫЕ
Контрагенты.Наименование КАК Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
В первом случае будет ошибка "... недостаточно прав ...". Второй запрос вернет список, проходящий по установленному ограничению.
Язык ограничения доступа к данным.
Подмножество языка запросов. В нем необходимо описать условие (секцию ГДЕ запроса). Такая секция будет добавляться к любым запросам при обращении к этому объекту. Если условие для объекта
принимает значение Истина, значит, операция выполняется. Особенности языка:
- В запросе всегда присутствует одна таблица в качестве источника данных – это таблица объекта, на который накладывается ограничение
- В запросе доступны только секции ИЗ и ГДЕ языка запросов
- В условиях можно указывать параметры сеанса и функциональные опции в качестве параметров запроса
- Не допускается применение оператора В ИЕРАРХИИ и предложения ИТОГИ
- Нельзя использовать виртуальные таблицы регистров (например, СрезПоследних или ОстаткиИОбороты)
- В запросе можно использовать шаблоны, упрощающие написание ограничений.
Простейший пример ограничения. Наименование - реквизит справочника Фирмы:
Можно обращаться через точку к полям реквизитов основной таблицы
Контрагенты ГДЕ Контрагенты.Регион.Наименование = "Иркутск"
Можно использовать соединения нескольких таблиц. Например, необходимо иметь доступ только к тем контрагентам, которые указаны как основной поставщик в каком-либо товаре:
Контрагенты ИЗ Справочник.Контрагенты КАК Контрагенты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Справочник.Товары КАК Товары
ПО
Контрагенты.Ссылка = Товары.Поставщик
Здесь явно нет секции ГДЕ, однако такое ограничение работает. Применяется следующий алгоритм:
- Запись считается доступной если в результате работы условия для одной записи таблицы основного объекта ограничения получена непустая таблица (т.е. таблица, содержащая не менее одной записи).
- Если в результате работы условия получается пустая таблица, то запись считается недоступной.
В качестве параметров в тексте запроса допустимо использовать параметры сеансов и не зависящие от параметров функциональные опции.
ГДЕ Автор = &ТекущийПользователь
Ограничения, полученные из одной роли, объединяются операцией И. Ограничения, полученные из разных ролей, объединяются операцией ИЛИ.
Инструкции препроцессора.
Дополнительная "нарезка" запроса.
#Если <Выражение> #Тогда
#ИначеЕсли <Выражение> #Тогда
#Иначе
#КонецЕсли
Выражения должны иметь тип Булево. В них можно использовать параметры сеанса. В зависимости от истинности, в текст запроса будет включено то или иное выражение. Если текст ограничения доступа содержит инструкции препроцессора, то его нельзя редактировать при помощи конструктора.
Шаблоны ограничений доступа.
Шаблоны ограничений актуальны в пределах одной роли. Текст шаблона содержит фрагмент ограничения доступа. В нем можно использовать параметры. Параметры в шаблоне выделяются символом «#». После этого символа далее можно использовать:
- Ключевое слово Параметр, после которого в скобках указывается номер параметра в шаблоне
- Ключевое слово ТекущаяТаблица – обозначает вставку в текст полного имени таблицы, для которой строится ограничение
- Ключевое слово ИмяТекущейТаблицы – обозначает вставку в текст полного имени таблицы (как строковое значение, в кавычках), к которой применяется инструкция, на текущем варианте встроенного языка
- Ключевое слово ИмяТекущегоПраваДоступа – содержит имя права, для которого выполняется текущее ограничение: ЧТЕНИЕ, ДОБАВЛЕНИЕ, ИЗМЕНЕНИЕ, УДАЛЕНИЕ
- Имя параметра шаблона – означает вставку в текст ограничения соответствующего параметра шаблона
- Символ "#" – обозначает вставку в текст одного символа "#".
В тексте ограничения используется формат #ИмяШаблона(...Параметры...). Параметры передаются в виде строки, затем добавляются в текст в виде строки (второй пример). Т е шаблоны играют роль простого шаблонизатора текста. Но это упрощение может очень сильно запутать код.
Пример шаблона ограничения по автору:
Текст шаблона:
ГДЕ #Параметр(1) = &ТекущийПользователь
Текст в ограничении
#ОграничениеПоАвтору(“Автор”)
Итог:
ГДЕ Автор = &ТекущийПользователь
Если в другом документе вместо реквизита Автор используется реквизит с именем Ответственный, то ограничение доступа:
#ОграничениеПоАвтору(“Ответственный”)
Пример шаблона ограничения с передачей "сложного" выражения
Текст шаблона:
ГДЕ #Параметр(1) = &ТекущийПользователь #Параметр(2)
Текст в ограничении
#ОграничениеПоАвтору(“Автор”, "ИЛИ ЭтоГруппа")
Итог:
ГДЕ Автор = &ТекущийПользователь ИЛИ ЭтоГруппа