v8: Регистр правил для контроля прав доступа Ключевые слова: права доступа
В общем я долго думал, как должен быть организован регистр правил для контроля прав доступа, а сегодня меня осенило - он должен быть организован так же, как правила сортировки почты Outlook или mail.ru, то бишь идет набор некоторых правил, они последовательно применяются и выдается результат.
Вкратце о тем - дело в том, что для одной ситуации может быть несколько вариантов правил, например если мы перепроводим приходную накладную, то подходят несколько правил и нужно расставить им приоритеты:
"Админ может перепроводить любую приходную накладную"
"Пользователь может перепроводить приходную накладную только текущим днем"
Можно было бы конечно идти путем максимального описания шаблона совпадения, но по-моему, если правила отсортированы по приоритету - то это более наглядный и удобный способ, да и правила получаются более компакными.
Регистр правил представляет собой таблицу с полями (к примеру):
Пользователь - какого пользователя касается.
Роль - какой роли касается (или категории пользователя) - роль или группа ролей
Объект - какого объекта метаданных касается (например - *, Справочники, Документы, Справочник.Номенклатура)
ГруппаОбъектов - чтобы объединить несколько видов метаданных в одну логическую группу (на уровне программы) и задавать правило для нескольких видов, а не для одного вида.
Подразделение - какого подразделения касается правило.
Склад - какого склада касается правило.
Товар - товар или группа товаров, которого касается правило.
ГруппаДоступа - группа доступов, чтобы не назначать каждый доступ отдельно.
Экземпляр - конкретный объект, которого касается правило.
Контрагент - контрагент или группа контрагентов.
Возможны поля для оперирования со временем документа:
ДнейНазад - какое количество дней назад от текущей даты. Вчера - 1 день, 0 - не указано (обычно для даты документа).
ДнейВперед - какое количество дней вперед от текущей даты. Завтра - 1 день, 0 - не указано (обычно для даты документа).
По аналогии с ДнейНазад, ДнейВперед, можно использовать поля - СекундНазад, СекундВперед.
Сегодня - если дата сегодняшняя (обычно для даты документа).
Возможны указания интервалов времени действия правил:
ВремяОт - время дня, от которого действует правило
ВремяДо - время дня, от которого действует правило
ДатаС - дата, с которой действует правило (для временных прав доступа)
ДатаПо - дата, по которую действует правило (для временных прав доступа)
Возможны поля для проверки авторства объектов:
Автор - булево, истина, если автором объекта, к которому осуществляется доступ является текущий пользователь.
КонтрагентПользователя - если данный контрагент обслуживается текущим пользователем.
СотрудникПользователя - если сотрудник соответствует пользователю.
Обязательные поля это:
Доступ - вид доступа.
Право - булево поле, определяет, разрешить или запретить доступ.
Продолжить - продолжить выполнение других правил после применения текущего.
Действует - действует ли правило (для временного отключения правил).
Комментарий - комментарий.
В начале предполагается что право есть.
Из регистра правил выбираются подходящие контексту правила до тех пор, пока в текущем правиле "Продолжить" - истина.
При выборе каждого правила значение права доступа назначается из поля Право правила.
Права доступа можно загнать в регистр сведений ПравилаДоступа, в нем так же должен быть ресурс "Порядок", чтобы можно было отсортировать правила по порядку.
В измерениях регистра лучше не использовать списки, т.к. тогда нельзя обрабатывать правила с помощью запроса.
Например могут быть такие правила (отсортированные по приоритету):
Роль = Разработчик
Доступ = *
Право = истина
Действует = ложь
Комментарий = я включаю это правило только если мне нужно произвести в базе массированные изменения
Роль = Разработчик
Доступ = Изменение
Право = истина
Объект = РегистрСведений.ПравилаПравДоступа
Комментарий = кто может назначать права доступа
Роль = Администратор
Доступ = Изменение
Право = истина
Объект = РегистрСведений.ПравилаПравДоступа
Комментарий = кто может назначать права доступа
Роль = Разработчик
Доступ = Изменение
Право = истина
Объект = РегистрСведений.ПравилаПравДоступа
Комментарий = кто может назначать права доступа
Роль = Старший пользователь
ГруппаОбъектов = Документы учета товаров
Доступ = Изменение
Склад = Акцизный
Право = ложь
Комментарий = старший пользователь не может работать по акцизному складу
Роль = Старший пользователь
ГруппаОбъектов = Документы учета товаров
Доступ = Перепроведение
ДнейНазад = 7
Право = истина
Комментарий = старший пользователь может перепроводить документы задним числом до 7 дней назад
Роль = Пользователь
ГруппаОбъектов = Документы учета товаров
Доступ = Перепроведение
Право = ложь
Комментарий = пользователь не может перепроводить документы
Пользователь = Директор Вася
Доступ = Изменение
Право = ложь
Экземпляр = Уставной капитал фирмы
Комментарий = директор попросил уберечь его от пагубного желания править уставной капитал
Пользователь = Директор Вася
ГруппаОбъектов = Документы учета товаров
Доступ = Перепроведение
Право = истина
Отчет = Зарплата
Роль = ГлавБух
Доступ = Получение
Право = истина
Комментарий = Главбух может смотреть зарплату сотрудников
Отчет = Зарплата
Доступ = Получение
Право = ложь
СотрудникПользователя=ложь
Комментарий = сотрудник может смотреть зарплату только по себе.
Доступ = *
Право = ложь
Комментарий = все, что не разрешено, запрещено.
Вот теперь вы понимаете, какими должны быть нормальные права доступа и понимаете, что галочные права доступа 1С безнадежно отстают от этих возможностей.
Вкратце напоминаю - весь контроль нужно вынести в модули, сделать только две роли - админ и пользователь.
На все объекты давать полные права (все равно ничего не получится сделать из того, что запрещено в модуле).
Ну и при открытии формы можно проверять, может ли юзверь редактировать объект, если нет - сразу делать ее недоступной.
Также на полную катушку нужно использовать привилегированные модули для реализации логики, в которой не нужно контролировать права доступа.
Для ускорения обработки правил рекомендуется считывать их при запуске системы и хранить в таблице значений.
Полезные ссылки:
Книга знаний: v8: Элегантная реализация прав доступа в 1С 80
|