Пример разграничения прав доступа

Материал из GedeminWiki
Перейти к: навигация, поиск

Решим такую задачу:

  1. На предприятии выделены группы пользователей: Директор, Бухгалтерия, Менеджеры А, Менеджеры Б.
  2. Менеджеры выписывают счета-фактуры, но так, что каждая группа менеджеров видит только документы своей группы.
  3. Бухгалтера видят все счета-фактуры и могут вносить в них изменения.
  4. Директор может только просматривать счета-фактуры, но не может их изменять.

Напомним, что настройку прав доступа и программирование на Гедымине следует осуществлять под учетной записью Administrator.

Содержание

Шаг 1. Создаем группы пользователей

  • Вызываем команду Исследователь-Сервис-Администратор-Группы пользователей.
  • Выбираем команду Добавить. На экране откроется диалоговое окно.
  • Вводим наименование группы Директор.
  • Запоминаем идентификатор группы (в нашем случае 7, у вас идентификатор может отличаться!).

sec_example_1.png

  • Нажимаем кнопку Ок.
  • Повторяем действия для создания групп Бухгалтерия, Менеджеры А, Менеджеры Б.

У нас получились следующие идентификаторы:

sec_example_2.png

Еще раз обращаем ваше внимание, на то, что в вашем случае идентификаторы групп могут отличаться!

Шаг 2. Создаем учетные записи пользователей и назначаем им группы

Учетные записи пользователей создаются в окне Исследователь-Сервис-Администратор-Пользователи. Для учебных целей мы создадим четыре записи: Директор -- Сидорский А.А., Бухгалтер -- Иванова И.И., Менеджер А -- Петров П.П. и Менеджер Б -- Сидоров С.С.

  • Воспользуемся командой Добавить и откроем на экране диалоговое окно.
  • Заполним поля: Наименование, Пароль, Подтверждение пароля.

sec_example_3.png

  • Каждой учетной записи должна быть поставлена в соответствие запись в справочнике контактов. Для ее создания, установим курсор в поле контакт и нажмем F2. На экране появится окно выбора типа создаваемого объекта:

sec_example_4.png

  • Укажем "Сотрудник предприятия".
  • В диалоговом окне заполним поля Фамилия, Имя, Отчетство.
  • Для объекта типа "Сотрудник предприятия" обязательно должны быть заполнена поля "Рабочая организация" и "Подразделение". Если нужного объекта нет в выпадающем списке, его всегда можно создать с помощью клавиши F2.

sec_example_5.png

  • Сохраняем запись в справочнике Сотрудников предприятия (контактов).
  • Теперь укажем группы для создаваемого пользователя. Воспользуемся кнопкой Группы... в правой части окна.

sec_example_6.png

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

sec_example_7.png

  • Аналогичным образом создадим пользователей Иванова, Петров и Сидоров, включив их в соответствующие группы.

sec_example_8.png

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

Шаг 3. Настраиваем права для класса объектов Счет-фактура

  • В Исследователе найдем раздел Торговля.
  • Раскроем его.
  • Установим курсор на позицию "04. Счета-фактуры (оптовая торговля)" и по правой кнопке мыши выберем из контекстного меню команду Свойства...

sec_example_9.png

  • Перейдем на вкладку Доступ.
  • Выберем из выпадающего списка вверху окна "Полный доступ".
  • С помощью кнопки "Исключить все" очистим список групп (останется только неудаляемая позиция Администраторы).
  • Из выпадающего списка внизу окна выберем "Менеджеры А" и нажмем кнопку "Добавить".
  • Аналогичные действия проделаем для группы "Менеджеры Б".
  • В итоге, список должен принять такой вид:

sec_example_10.png

  • Выбираем из выпадающего списка вверху окна уровень доступа "Просмотр и изменение".
  • Добавляем в список группу "Бухгалтерия":

sec_example_11.png

  • Последним шагом, выбираем уровень доступа "Только просмотр" и добавляем в список группу Директор:

sec_example_12.png

  • Закрываем окно кнопкой Ок.

Шаг 4. Программируем назначение прав доступа для менеджеров

На данном этапе, задача уже почти решена за тем исключением, что менеджеры обеих групп имеют доступ ко всем счетам фактурам в базе данных. Разграничить доступ между группами можно, определив обработчик события BeforePost бизнес объекта. В зависимости от того, к какой группе менеджеров принадлежит текущий пользователь, будем исключать бит противоположной группы из всех трех дескрипторов безопасности документа. Таким образом, лишая ее всех прав на запись.

  • Откроем окно со списком счетов-фактур: Исследователь-Торговля-04.Счета-фактуры (оптовая торговля).
  • Перейдем в окно.
  • С помощью коомбинации клавиш Ctrl-Shift-E переведем окно в режим дизайнера. На экране появятся два дополнительных окна: Палитра компонентов и Инспектор объектов:

sec_example_13.png

  • В верхней части Инспектора объектов расположен выпадающий список компонентов формы. Найдем и выберем в нем компонент gdcInvDocument типа TgdcInvDocument:

sec_example_14.png

  • Перейдем на вкладку События в окне Инспектора объектов.
  • Установим курсор на позицию BeforePost.

sec_example_15.png

  • Нажмем кнопку с изображением трех точек.
  • Откроется Редактор скрипт объектов.
  • Введем следующий код обработчика события:
 Option Explicit

 Sub gdcInvDocumentBeforePost(ByVal DataSet)
 '*** Данный код необходим для вызова встроенного обработчика ***
 '*** В случае его удаления возможно нарушение работы системы ***
   Call   Inherited(DataSet, "BeforePost", Array(DataSet))
 '*** конец кода поддержки встроенного обработчика            ***

   Dim M, ManA_Mask, ManB_Mask
   ManA_Mask = CLng(2 ^ (9 - 1))  ' битовая маска группы Менеджеры А
   ManB_Mask = CLng(2 ^ (10 - 1)) ' битовая маска группы Менеджеры Б

   If (IBLogin.InGroup And ManA_Mask) <> 0 Then
     ' Если пользователь из группы А, то исключим группу Б
     M = Not ManB_Mask
   ElseIf (IBLogin.InGroup And ManB_Mask) <> 0 Then
     ' Если пользователь из группы Б, то исключим группу А
     M = Not ManA_Mask
   Else
     ' Если документ ввел не менеджер, то перекроем любой
     ' доступ к нему менеджерам
     M = Not (ManA_Mask + ManB_Mask)
   End If

   ' выключим соответствующие биты из дескрипторов безопасности
   DataSet.FieldByName("aview").AsInteger = _
     DataSet.FieldByName("aview").AsInteger And M
   DataSet.FieldByName("achag").AsInteger = _
     DataSet.FieldByName("achag").AsInteger And M
   DataSet.FieldByName("afull").AsInteger = _
     DataSet.FieldByName("afull").AsInteger And M

 End Sub
  • Сохраним изменения с помощью команды па панели инструментов Редактора скрипт объектов:

sec_example_16.png

  • Закроем Редактор скрипт объектов.
  • На палитре компонентов выберем команду "Сохранить и выйти":

sec_example_17.png

Шаг 5. Тестируем созданную схему

  • Поочередно подключимся к базе данных под учетными записями Administrator, Петров П П, Сидоров С.С. и создадим под каждой из них по одной счет-фактуре.
  • Подключимся под учетной записью Сидорский А. А. и убедимся, что пользователь видит все счета-фактуры, но не может их менять.
  • Подключимся под учетной записью Иванова И. И. и убедимся, что бухгалтер видит и может менят все счета-фактуры, но не может их удалять.
  • Подключимся под учетной записью Петров П П и убедимся, что менеджер видит только свои счета фактуры.
  • Аналогичным образом проверим менеджера из группы Б.
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты