Дополнительный урок. Динамическая безопасность
Применимо к: 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
В разделе Табличная модель Обозреватель >источники данных щелкните правой кнопкой мыши подключение и выберите пункт Импорт новых таблиц.
Если появляется диалоговое окно "Учетные данные олицетворения", введите учетные данные олицетворения, использованные в занятии 2 "Добавление данных".
В навигаторе выберите таблицу DimSalesTerritory и нажмите кнопку ОК.
В редакторе запросов щелкните запрос DimSalesTerritory, а затем удалите столбец SalesTerritoryAlternateKey.
Щелкните Импорт.
В рабочую область модели добавляется новая таблица. Объекты и данные из исходной таблицы DimSalesTerritory импортируются в табличную модель AW Internet Sales.
После успешного импорта таблицы нажмите кнопку Закрыть.
Добавление таблицы с именами пользователей
Таблица DimEmployee в примере базы данных AdventureWorksDW содержит данные пользователей из домена AdventureWorks. Эти имена пользователей не существуют в вашей среде. Необходимо создать в модели таблицу, содержащую небольшую выборку данных фактических пользователей из вашей организации (по крайней мере трех). Затем добавьте этих пользователей в качестве членов в новую роль. Вам не требуется знать пароли для выбранных имен пользователей, но нужно использовать фактические имена пользователей Windows из собственного домена.
Добавление таблицы EmployeeSecurity
Откройте Microsoft Excel и создайте лист.
Скопируйте приведенную ниже таблицу, включая строку заголовка, и вставьте ее в лист.
|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>|
Замените имя, фамилию и сочетание домена и имени пользователя на имена и идентификаторы входа трех пользователей из организации. Укажите имя одного пользователя в первых двух строках с идентификатором EmployeeId 1. Это означает, что пользователь относится к нескольким территориям сбыта. Не изменяйте поля EmployeeId и SalesTerritoryId.
Сохраните лист как SampleEmployee.
На листе выберите все ячейки с данными о сотрудниках, включая заголовки, а затем щелкните выделенные сведения правой кнопкой мыши и выберите пункт Копировать.
В SSDT откройте меню Правка и выберите Вставить.
Если команда вставки неактивна, щелкните любой столбец в любой таблице в окне конструктора моделей и повторите попытку.
В поле Имя таблицы диалогового окна Просмотр вставки введите EmployeeSecurity.
Убедитесь, что в области Вставляемые данные данные включают все сведения о пользователях и заголовки с листа SampleEmployee.
Установите флажок Использовать первую строку в качестве заголовков столбцов и нажмите кнопку ОК.
Создается таблица с именем EmployeeSecurity, которая содержит данные о сотрудниках, скопированные с листа SampleEmployee.
Создание связей между таблицами FactInternetSales DimGeography и DimSalesTerritory
Таблицы FactInternetSales DimGeography и DimSalesTerritory содержат общий столбец SalesTerritoryId. Столбец SalesTerritoryId таблицы DimSalesTerritory содержит значения с другим идентификатором для каждой территории сбыта.
Создание связей между таблицами FactInternetSales DimGeography и DimSalesTerritory
В таблице DimGeography в представлении схемы нажмите и удерживайте столбец SalesTerritoryId, а затем перетащите курсор на столбец SalesTerritoryId в таблице DimSalesTerritory.
В таблице FactInternetSales нажмите и удерживайте столбец SalesTerritoryId, а затем перетащите курсор на столбец SalesTerritoryId в таблице DimSalesTerritory.
Обратите внимание, что для свойства "Активна" этой связи установлено значение False, то есть связь неактивна. С таблицей FactInternetSales установлена другая активная связь.
Скрытие таблицы EmployeeSecurity в клиентских приложениях
В этой задаче вы скрываете таблицу EmployeeSecurity, чтобы она не отображалась в списке полей клиентского приложения. Имейте в виду, что скрытие таблицы не повышает ее защищенность. Пользователи по-прежнему могут запрашивать данные из таблицы EmployeeSecurity, если они знают, как это сделать. Чуть позже вы примените фильтр позже, чтобы защитить данные в таблице EmployeeSecurity, запретив пользователям запрашивать любые ее данные.
Скрытие таблицы EmployeeSecurity в клиентских приложениях
- В представлении схемы конструктора моделей щелкните правой кнопкой заголовок таблицы Employee и выберите пункт Скрыть из набора клиентских средств.
Создание роли пользователя "Торговые специалисты по территориям"
В этой задаче вы создадите роль пользователя. Она включает в себя фильтр строк, определяющий, какие строки таблицы DimSalesTerritory видны пользователям. После этого фильтр применяется в направлении "один ко многим" ко всем остальным таблицам, связанным с DimSalesTerritory. Вы также примените фильтр, который защищает всю таблицу EmployeeSecurity, запрещая любым пользователям, являющимся членами роли, запрашивать в ней данные.
Примечание
Создаваемая здесь роль "Торговые специалисты по территориям" позволяет членам просматривать (или запрашивать) данные о продажах только для той территории сбыта, к которой они относятся. При добавлении пользователя, являющегося членом роли, созданной в разделе Занятие 11. Создание ролей, в качестве члена в роль "Торговые специалисты по территориям", вы получаете сочетание разрешений. Если пользователь является членом нескольких ролей, то разрешения и фильтры строк, определенные для каждой их них, применяются совокупно. То есть комбинация ролей дает пользователю больше прав.
Создание роли пользователя "Торговые специалисты по территориям"
В SSDT откройте меню Модель и выберите Роли.
В диспетчере ролей нажмите кнопку Создать.
В список добавляется новая роль с разрешением "Нет".
Щелкните эту роль, а затем в столбце Имя измените ее имя на Торговые специалисты по территориям.
В столбце Разрешения щелкните раскрывающийся список и выберите разрешение Чтение.
Откройте вкладку Члены, а затем щелкните Добавить.
В поле Введите имя объекта диалогового окна Выберите пользователя или группу введите имя первого пользователя из выборки, использованное при создании таблицы EmployeeSecurity. Щелкните Проверить имена, чтобы проверить допустимость имени, а затем нажмите кнопку ОК.
Повторите этот шаг, добавляя другие имена пользователей из выборки, использованные при создании таблицы EmployeeSecurity.
Перейдите на вкладку Фильтры строк.
Для таблицы EmployeeSecurity в столбце Фильтр DAX введите следующую формулу:
=FALSE()
Эта формула указывает, что все столбцы разрешаются в логическое условие False. Таким образом, член роли "Торговые специалисты по территориям" не может запросить столбцы из таблицы EmployeeSecurity.
Для таблицы 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.
В диспетчере ролей нажмите кнопку ОК.
Тестирование роли пользователя "Торговые специалисты по территориям"
В этой задаче вы воспользуетесь функцией "Анализ в Excel" в SSDT, чтобы протестировать эффективность роли пользователя "Торговые специалисты по территориям". Укажите одно из имен пользователей, добавленных в таблицу EmployeeSecurity и в число членов роли. Затем это имя пользователя используется как имя реального пользователя в соединении между Excel и моделью.
Тестирование роли пользователя "Торговые специалисты по территориям"
В SSDT откройте меню Модель и выберите Анализ в Excel.
В поле Укажите имя пользователя или роль для подключения к модели диалогового окна Анализ в Excel выберите Другой пользователь Windows, а затем нажмите кнопку Обзор.
В поле Введите имя объекта диалогового окна Выберите пользователя или группу введите имя пользователя, включенное в таблицу EmployeeSecurity, и щелкните Проверить имена.
Нажмите кнопку ОК, чтобы закрыть диалоговое окно Выберите пользователя или группу, и еще раз нажмите ОК, чтобы закрыть диалоговое окно Анализ в Excel.
В Excel открывается новая книга. Автоматически создается сводная таблица. Список полей сводной таблицы включает большинство полей данных, доступных в новой модели.
Обратите внимание, что таблица EmployeeSecurity не отображается в списке полей сводной таблицы. Вы скрыли ее для клиентских средств в предыдущей задаче.
В области ∑ Internet Sales (меры) списка Поля выберите меру InternetTotalSales. Она вводится в полях Значения.
Выберите столбец SalesTerritoryId из таблицы DimSalesTerritory. Он вводится в полях Метки строк.
Обратите внимание, что цифры интернет-продаж отображаются только для одного региона, к которому относится использованное вами имя пользователя. Если выбрать в поле "Метка строки" другой столбец из таблицы DimGeography, например "Город", будут отображаться только города на территории сбыта, к которой относится действующий пользователь.
Этот пользователь не может просмотреть или запросить данные об интернет-продажах для территорий, отличных от той, к которой он относится. Это ограничение обусловлено тем, что определенный для таблицы DimSalesTerritory фильтр строк в роли пользователя "Торговые специалисты по территориям" защищает все данные, относящиеся к другим территориям сбыта.
См. также:
USERNAME, функция (DAX)
Функция LOOKUPVALUE (DAX)
CUSTOMDATA, функция (DAX)