Поделиться через


Дополнительный урок. Динамическая безопасность

Применимо к: SQL Server 2017 и более поздних версий Analysis Services Azure Analysis Services Fabric/Power BI Premium

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

Для реализации динамической безопасности нужно добавить в модель таблицу с именами тех пользователей, которые могут подключаться к модели и просматривать ее объекты и данные. Рассматриваемая в этом учебнике модель создавалась в контексте Adventure Works. Однако для выполнения этого занятия нужно добавить таблицу с пользователями из вашего собственного домена. Пароли для добавляемых имен пользователей знать не требуется. Чтобы создать таблицу EmployeeSecurity с небольшой выборкой пользователей из собственного домена, используйте функцию вставки, вставляя данные из электронной таблицы Excel. В реальном сценарии, скорее всего, использовалась бы таблица из рабочей базы данных, например таблица DimEmployee.

Для реализации динамической безопасности используйте две функции DAX: функцию USERNAME (DAX) и функцию LOOKUPVALUE (DAX). Такие функции, применяемые в формуле фильтра строк, определяются в новой роли. Функция LOOKUPVALUE позволяет формуле указать значение из таблицы EmployeeSecurity. Затем значение передается из формулы в функцию USERNAME, которая указывает, что имя вошедшего в систему пользователя относится к этой роли. Затем пользователь может просматривать только данные, указанные фильтрами строк роли. В данном случае укажите, что сотрудники отдела продаж могут просматривать данные об интернет-продажах только для тех территорий, членами которых они являются.

Те задачи, которые уникальны для данного сценария табличной модели Adventure Works, но не всегда применимы к реальным условиям, обозначаются соответствующим образом. Для каждой задачи приведены дополнительные сведения относительно ее назначения.

Предполагаемое время для завершения этого урока: 30 минут

Предварительные требования

Эта дополнительная статья урока является частью руководства по табличному моделированию, которое должно быть выполнено по порядку. Прежде чем выполнять задачи в этом дополнительном занятии, нужно завершить предыдущие занятия.

Добавление таблицы DimSalesTerritory в проект табличной модели AW Internet Sales

Чтобы реализовать динамическую безопасность для этого сценария Adventure Works, нужно добавить в модель две дополнительные таблицы. Первая добавляемая таблица — это DimSalesTerritory (территория сбыта) из той же базы данных AdventureWorksDW. Позднее вы примените к таблице SalesTerritory фильтр строк, определяющий данные, которые разрешено просматривать вошедшему в систему пользователю.

Добавление таблицы DimSalesTerritory

  1. В разделе Табличная модель Обозреватель >источники данных щелкните правой кнопкой мыши подключение и выберите пункт Импорт новых таблиц.

    Если появляется диалоговое окно "Учетные данные олицетворения", введите учетные данные олицетворения, использованные в занятии 2 "Добавление данных".

  2. В навигаторе выберите таблицу DimSalesTerritory и нажмите кнопку ОК.

  3. В редакторе запросов щелкните запрос DimSalesTerritory, а затем удалите столбец SalesTerritoryAlternateKey.

  4. Щелкните Импорт.

    В рабочую область модели добавляется новая таблица. Объекты и данные из исходной таблицы DimSalesTerritory импортируются в табличную модель AW Internet Sales.

  5. После успешного импорта таблицы нажмите кнопку Закрыть.

Добавление таблицы с именами пользователей

Таблица DimEmployee в примере базы данных AdventureWorksDW содержит данные пользователей из домена AdventureWorks. Эти имена пользователей не существуют в вашей среде. Необходимо создать в модели таблицу, содержащую небольшую выборку данных фактических пользователей из вашей организации (по крайней мере трех). Затем добавьте этих пользователей в качестве членов в новую роль. Вам не требуется знать пароли для выбранных имен пользователей, но нужно использовать фактические имена пользователей Windows из собственного домена.

Добавление таблицы EmployeeSecurity

  1. Откройте Microsoft Excel и создайте лист.

  2. Скопируйте приведенную ниже таблицу, включая строку заголовка, и вставьте ее в лист.

      |EmployeeId|SalesTerritoryId|FirstName|LastName|LoginId|  
      |---------------|----------------------|--------------|-------------|------------|  
      |1|2|<user first name>|<user last name>|\<domain\username>|  
      |1|3|<user first name>|<user last name>|\<domain\username>|  
      |2|4|<user first name>|<user last name>|\<domain\username>|  
      |3|5|<user first name>|<user last name>|\<domain\username>|  
    
  3. Замените имя, фамилию и сочетание домена и имени пользователя на имена и идентификаторы входа трех пользователей из организации. Укажите имя одного пользователя в первых двух строках с идентификатором EmployeeId 1. Это означает, что пользователь относится к нескольким территориям сбыта. Не изменяйте поля EmployeeId и SalesTerritoryId.

  4. Сохраните лист как SampleEmployee.

  5. На листе выберите все ячейки с данными о сотрудниках, включая заголовки, а затем щелкните выделенные сведения правой кнопкой мыши и выберите пункт Копировать.

  6. В SSDT откройте меню Правка и выберите Вставить.

    Если команда вставки неактивна, щелкните любой столбец в любой таблице в окне конструктора моделей и повторите попытку.

  7. В поле Имя таблицы диалогового окна Просмотр вставки введите EmployeeSecurity.

  8. Убедитесь, что в области Вставляемые данные данные включают все сведения о пользователях и заголовки с листа SampleEmployee.

  9. Установите флажок Использовать первую строку в качестве заголовков столбцов и нажмите кнопку ОК.

    Создается таблица с именем EmployeeSecurity, которая содержит данные о сотрудниках, скопированные с листа SampleEmployee.

Создание связей между таблицами FactInternetSales DimGeography и DimSalesTerritory

Таблицы FactInternetSales DimGeography и DimSalesTerritory содержат общий столбец SalesTerritoryId. Столбец SalesTerritoryId таблицы DimSalesTerritory содержит значения с другим идентификатором для каждой территории сбыта.

Создание связей между таблицами FactInternetSales DimGeography и DimSalesTerritory

  1. В таблице DimGeography в представлении схемы нажмите и удерживайте столбец SalesTerritoryId, а затем перетащите курсор на столбец SalesTerritoryId в таблице DimSalesTerritory.

  2. В таблице FactInternetSales нажмите и удерживайте столбец SalesTerritoryId, а затем перетащите курсор на столбец SalesTerritoryId в таблице DimSalesTerritory.

    Обратите внимание, что для свойства "Активна" этой связи установлено значение False, то есть связь неактивна. С таблицей FactInternetSales установлена другая активная связь.

Скрытие таблицы EmployeeSecurity в клиентских приложениях

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

Скрытие таблицы EmployeeSecurity в клиентских приложениях

  • В представлении схемы конструктора моделей щелкните правой кнопкой заголовок таблицы Employee и выберите пункт Скрыть из набора клиентских средств.

Создание роли пользователя "Торговые специалисты по территориям"

В этой задаче вы создадите роль пользователя. Она включает в себя фильтр строк, определяющий, какие строки таблицы DimSalesTerritory видны пользователям. После этого фильтр применяется в направлении "один ко многим" ко всем остальным таблицам, связанным с DimSalesTerritory. Вы также примените фильтр, который защищает всю таблицу EmployeeSecurity, запрещая любым пользователям, являющимся членами роли, запрашивать в ней данные.

Примечание

Создаваемая здесь роль "Торговые специалисты по территориям" позволяет членам просматривать (или запрашивать) данные о продажах только для той территории сбыта, к которой они относятся. При добавлении пользователя, являющегося членом роли, созданной в разделе Занятие 11. Создание ролей, в качестве члена в роль "Торговые специалисты по территориям", вы получаете сочетание разрешений. Если пользователь является членом нескольких ролей, то разрешения и фильтры строк, определенные для каждой их них, применяются совокупно. То есть комбинация ролей дает пользователю больше прав.

Создание роли пользователя "Торговые специалисты по территориям"

  1. В SSDT откройте меню Модель и выберите Роли.

  2. В диспетчере ролей нажмите кнопку Создать.

    В список добавляется новая роль с разрешением "Нет".

  3. Щелкните эту роль, а затем в столбце Имя измените ее имя на Торговые специалисты по территориям.

  4. В столбце Разрешения щелкните раскрывающийся список и выберите разрешение Чтение.

  5. Откройте вкладку Члены, а затем щелкните Добавить.

  6. В поле Введите имя объекта диалогового окна Выберите пользователя или группу введите имя первого пользователя из выборки, использованное при создании таблицы EmployeeSecurity. Щелкните Проверить имена, чтобы проверить допустимость имени, а затем нажмите кнопку ОК.

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

  7. Перейдите на вкладку Фильтры строк.

  8. Для таблицы EmployeeSecurity в столбце Фильтр DAX введите следующую формулу:

      =FALSE()  
    

    Эта формула указывает, что все столбцы разрешаются в логическое условие False. Таким образом, член роли "Торговые специалисты по территориям" не может запросить столбцы из таблицы EmployeeSecurity.

  9. Для таблицы DimSalesTerritory введите следующую формулу:

    ='DimSalesTerritory'[SalesTerritoryKey]=LOOKUPVALUE('EmployeeSecurity'[SalesTerritoryId], 
      'EmployeeSecurity'[LoginId], USERNAME(), 
      'EmployeeSecurity'[SalesTerritoryId], 'DimSalesTerritory'[SalesTerritoryKey]) 
    

    В этой формуле функция LOOKUPVALUE возвращает все значения для столбца DimEmployeeSecurity[SalesTerritoryId], где EmployeeSecurity[LoginId] совпадает с именем вошедшего в систему пользователя Windows, а EmployeeSecurity[SalesTerritoryId] совпадает с DimSalesTerritory[SalesTerritoryId].

    Затем возвращенный функцией LOOKUPVALUE набор идентификаторов территорий сбыта используется для ограничения строк, отображаемых в таблице DimSalesTerritory. Отображаются только те строки, SalesTerritoryID которых входит в набор идентификаторов, возвращенных функцией LOOKUPVALUE.

  10. В диспетчере ролей нажмите кнопку ОК.

Тестирование роли пользователя "Торговые специалисты по территориям"

В этой задаче вы воспользуетесь функцией "Анализ в Excel" в SSDT, чтобы протестировать эффективность роли пользователя "Торговые специалисты по территориям". Укажите одно из имен пользователей, добавленных в таблицу EmployeeSecurity и в число членов роли. Затем это имя пользователя используется как имя реального пользователя в соединении между Excel и моделью.

Тестирование роли пользователя "Торговые специалисты по территориям"

  1. В SSDT откройте меню Модель и выберите Анализ в Excel.

  2. В поле Укажите имя пользователя или роль для подключения к модели диалогового окна Анализ в Excel выберите Другой пользователь Windows, а затем нажмите кнопку Обзор.

  3. В поле Введите имя объекта диалогового окна Выберите пользователя или группу введите имя пользователя, включенное в таблицу EmployeeSecurity, и щелкните Проверить имена.

  4. Нажмите кнопку ОК, чтобы закрыть диалоговое окно Выберите пользователя или группу, и еще раз нажмите ОК, чтобы закрыть диалоговое окно Анализ в Excel.

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

    Обратите внимание, что таблица EmployeeSecurity не отображается в списке полей сводной таблицы. Вы скрыли ее для клиентских средств в предыдущей задаче.

  5. В области ∑ Internet Sales (меры) списка Поля выберите меру InternetTotalSales. Она вводится в полях Значения.

  6. Выберите столбец SalesTerritoryId из таблицы DimSalesTerritory. Он вводится в полях Метки строк.

    Обратите внимание, что цифры интернет-продаж отображаются только для одного региона, к которому относится использованное вами имя пользователя. Если выбрать в поле "Метка строки" другой столбец из таблицы DimGeography, например "Город", будут отображаться только города на территории сбыта, к которой относится действующий пользователь.
    Этот пользователь не может просмотреть или запросить данные об интернет-продажах для территорий, отличных от той, к которой он относится. Это ограничение обусловлено тем, что определенный для таблицы DimSalesTerritory фильтр строк в роли пользователя "Торговые специалисты по территориям" защищает все данные, относящиеся к другим территориям сбыта.

См. также:

USERNAME, функция (DAX)
Функция LOOKUPVALUE (DAX)
CUSTOMDATA, функция (DAX)