Перейти к основному содержимому

Элемент проекта вида «КлючДоступа»

КлючДоступа позволяет вам описать собственные аспекты контроля прав доступа в приложении. Каждый элемент этого вида описывает в проекте один тип. Вы создаете экземпляры ключа (экземпляры этого типа). Они не хранятся в базе данных, хранится только их хеш-сумма. О назначении ключей доступа вы можете подробнее прочитать здесь:

Виды ключей доступа​

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

Вычисляемые ключи доступа​

Если значение свойства равно Ложь, порождаются экземпляры вычисляемых ключей доступа, наследуемые от типа ВычисляемыйКлючДоступа.Объект (подробнее про порождаемые типы). Для таких ключей доступа необходимо определить обработчик ПроверитьНаличиеКлючейДоступа, который позволяет проверить наличие у пользователей ключей доступа соответствующего типа. Также для них доступны методы пересчетов и вызываются системные пересчеты (подробнее).

Если вы хотите контролировать актуальность ключей доступа самостоятельно, вы можете отключить все системные вызовы пересчетов с помощью свойства ОтключитьСистемныеПересчеты элемента проекта КлючДоступа. По умолчанию системные пересчеты выполняются в следующих случаях:

  • запись ключа доступа, экземпляра которого еще нет в системе (выполняется пересчет экземпляра ключа доступа для всех пользователей);
  • создание нового пользователя в системе c непустым списком утверждений (выполняется пересчет всех экземпляров ключей доступа для данного пользователя);
  • изменение утверждений пользователя (выполняется пересчет всех экземпляров ключей доступа для данного пользователя);
  • изменение признака Администратор у пользователя: Истина → Ложь (выполняется пересчет всех экземпляров ключей доступа для данного пользователя).

Для создания экземпляра ключа доступа нужно вызвать конструктор типа {ИмяВычисляемогоКлючаДоступа}.Объект. Например, для ключа доступа с именем КлючиГруппСотрудников:

пер Ключ = новый КлючиДоступа.Объект()

Выдаваемые ключи доступа​

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

Пример работы с выдаваемым ключом доступа
// Выдача ключа доступа указанному сотруднику
метод ВыдатьКлючСотрудника(Сотрудник: Сотрудники.Ссылка)
знч ПользовательСотрудника = НайтиПользователяСотрудника(Сотрудник)

если ПользовательСотрудника != Неопределено
новый ВыдаваемыйКлючДоступаСотрудника.Объект().Выдать([ПользовательСотрудника])
;
;

// Отзыв ключа доступа указанного сотрудника
метод ОтозватьКлючСотрудника(Сотрудник: Сотрудники.Ссылка)
знч ПользовательСотрудника = НайтиПользователяСотрудника(Сотрудник)

если ПользовательСотрудника != Неопределено
новый ВыдаваемыйКлючДоступаСотрудника.Объект().Отозвать([ПользовательСотрудника])
;
;

// Поиск Пользователя, соответствующего указанному сотруднику
метод НайтиПользователяСотрудника(Сотрудник: Сотрудники.Ссылка): Пользователи.Ссылка?
знч Запрос = Запрос{
ВЫБРАТЬ ПЕРВЫЕ 1
Сотрудники.Пользователь КАК Пользователь
ИЗ
Сотрудники КАК Сотрудники
ГДЕ
Сотрудники.Ссылка == %Сотрудник
}

возврат Запрос.Выполнить().ЕдинственныйИлиНеопределено()?.Пользователь
;

Поведение системы при изменении свойства «РучнаяВыдача»​

При изменении значения свойства РучнаяВыдача в элементе проекта вида КлючДоступа никакие миграции не выполняются. Это значит, что очистка ключей доступа не происходит. То есть экземпляр ключа доступа, выданный до обновления, сохранится в системе и будет доступен для пользователя.

Параметры ключа доступа​

Элемент проекта вида КлючДоступа может иметь параметры. Для каждого сочетания значений этих параметров «Шина» будет создавать свой уникальный экземпляр ключа.

Например, если ваш элемент проекта не имеет параметров, то вы можете создать только один экземпляр ключа доступа:

пер ЭкземплярКлюча = новый КлючиДоступа.Объект()

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

  • ВремяСуток: Рабочее, Нерабочее,
  • СпособПодключения: Локально, Удаленно,

то такой ключ доступа может иметь уже четыре экземпляра:

пер ЭкземплярКлюча1 = новый КлючиДоступаСПараметрами.Объект(ВремяСуток.Рабочее, СпособПодключения.Локально)
пер ЭкземплярКлюча2 = новый КлючиДоступаСПараметрами.Объект(ВремяСуток.Рабочее, СпособПодключения.Удаленно)
пер ЭкземплярКлюча3 = новый КлючиДоступаСПараметрами.Объект(ВремяСуток.Нерабочее, СпособПодключения.Локально)
пер ЭкземплярКлюча4 = новый КлючиДоступаСПараметрами.Объект(ВремяСуток.Нерабочее, СпособПодключения.Удаленно)

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

Предопределенные классы ключей доступа​

В «Шине» существуют предопределенные вычисляемые ключи доступа. Экземпляры этих ключей «Шина» выдает пользователям автоматически, а также использует их для организации простейшей системы прав доступа (подробнее).

Рекомендации по использованию ключей доступа​

  1. При использовании экземпляров ключей доступа необходимо помнить, что ключи доступа являются вторичными данными по отношению к объектам, права на которые они предоставляют. То есть крайне не рекомендуется получать ключи доступа пользователей с помощью метода Пользователи.ПолучитьКлючиДоступа() и на их основании выстраивать логику работы с сущностями, права на которые они дают.

  2. Если логика системы прав прикладного решения поддерживает использование как вычисляемых, так и выдаваемых ключей доступа, рекомендуется отдавать предпочтение выдаваемым ключам доступа. Использование вычисляемых ключей зачастую приводит к усложнению логики системы прав доступа и ее замедлению из-за лишних пересчетов.

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

См. также​