Читайте другие главы:
Extreme DAX-Глава 1 DAX в бизнес-аналитике
Extreme DAX-Глава 2 Дизайн модели
Extreme DAX-Глава 3 DAX Использование
Extreme DAX-Глава 4 Контекст и фильтрация
Исследование Power BI
Наконец-то пятая глава здесь.
В этой главе рассказывается, как реализовать различные гарантии безопасности в моделях PowerBI. В дополнение к знакомой нам безопасности RLS на уровне строк в этой статье также описывается безопасность на уровне объекта, безопасность на уровне таблицы, безопасность на уровне столбца, безопасность на уровне значений и т. д. Каждый должен реализовать требования безопасности, которые в большей степени соответствуют требованиям, основанным на реальных бизнес-сценариях.
Полный текст переведен и в настоящее время находится на стадии корректуры и доработки.
В дальнейшем на этом официальном аккаунте будут публиковаться соответствующие статьи в соответствии с ритмом. Спасибо за поддержку.
Комментарии и предложения по содержанию перевода этой главы можно оставлять в области комментариев или в группе WeChat. Спасибо.
При обработке данных вы можете столкнуться с некоторыми данными, которые необходимо зашифровать. Даже внутри организации некоторые люди имеют более высокий авторитет, чем другие. В модели Power BI также предусмотрены некоторые методы для обеспечения безопасности данных. В этой главе вы узнаете, как это сделать.
Обратите внимание, что мы не будем рассматривать безопасность распространения или совместного использования отчетов и панелей мониторинга в Power BI. Вместо этого мы фокусируемся на безопасности моделей Power BI. Распространенный сценарий заключается в том, что два пользователя, использующие один и тот же отчет, будут видеть разное содержимое отчета в зависимости от их настроек разрешений.
В этой главе рассматриваются следующие темы.
использоватьБезопасность на уровне строк(Row-Level Security,RLS),Пользователям можно запретить просмотр Power BI данные в модели. СБН да Power BI Основная форма Безопасность в модели. Он называется уровнем ХОРОШО, потому что вы можете определить, какие ХОРОШО будут видны пользователю для каждой поверхности модели. Стоит отметить да, из-за RLS Настройка работает для всей модели, поэтому любой визуальный отчет на основе модели Воля удовлетворяет ее стратегии Безопасности.
Прежде чем мы углубимся, давайте проясним: когда вам нужен способ установки разрешений для модели, рекомендуется обязательно использовать RLS (или соответствующую концепцию безопасности на уровне объекта, которую мы обсудим позже в этой статье). главу). Не пытайтесь обойти эту проблему и не пытайтесь сделать это, поделившись отчетом (или не поделившись им). Вы не можете быть уверены, как ваш отчет будет использоваться в будущем: пользователи могут получить Power BI Права доступа модели также могут быть случайно добавлены в группу безопасности или в других непредсказуемых обстоятельствах. Точно так же не пытайтесь написать что-то, что возвращает конкретные данные при выполнении определенных условий. DAX 度量ценитьиз方式Приходить确保данныеиз Безопасность。Отчет о разработке на основе этой моделистол Персонал может легко обойти эти условия。Проще говоряда:Каждый пользователь, имеющий доступ к модели Только Может видеть данные, которые разрешено видеть。
RLS дана основе Безопасность Рольвыполнитьиз。Можетна основе Нет同Рольнастраивать独立из Безопасность Стратегия。Например,настраивать高管из Безопасность Роль,или ВОЗ人力资源经理из Безопасность Роль、Вы даже можете создавать роли для отдельных продавцов.
Безопасность РольдаPower BIДизайн моделииз一部分,Это не относится к членству в ролях. Только имеет пост-модель существования,В роль могут быть добавлены только пользователи Воля. Вы можете иметь столько персонажей Безопасности, сколько захотите.,Но в то же время есть некоторые вещи, которые следует учитывать,Мы Волясуществовать эти должности в этом разделе.
Роли безопасности да определяются и поддерживаются через окно «Управление ролями», как показано на рисунке 5.1.
Рисунок 5.1 Окно роли управления
Как только вы опубликуете модель, определяющую характер Безопасности,Помимо опубликованных моделейсуществовать工作区из管理员、членилиженьшеньи ВОЗ,Недоступно для других да.
существовать Power BI В сервисе можно использовать Набор данныхначальство下文菜单серединаизбезопасностьварианты для просмотрада Нет не определено Безопасность Роль,нравиться Рисунок Как показано в 5.2.
Рисунок 5.2. Поиск параметров безопасности
Мы можем добавлять людей к ролям безопасности индивидуально, добавляя адреса электронной почты или в виде групп (безопасности).
Обратите внимание, что добавление кого-либо к роли безопасности не гарантирует нормальный доступ к набору данных. Следующие два условия должны быть выполнены одновременно.
После создания персонажа Безопасность,就Может定义该Рольиз实际Безопасность Стратегия了。мы можемсуществовать模型серединаизодинили Несколькоповерхностьначальство声明 DAXФильтр безопасности.пожалуйста, обрати внимание,Фильтр безопасности DAX заявляет, что по роли иповерхности мы можем иметь разные фильтры безопасности на одной и той же поверхности, если бы только у них разные роли в безопасности.
Фильтр безопасности DAX Конечно Какое ХОРОШО видно у этого пользователя Безопасность Волясуществовать поверхность. ты можешь, Воля Фильтр безопасности DAX понимает это, добавляет столбец к существованиюповерхности, а затем определяет, является ли значение каждого ХОРОШО «ИСТИНА» или «ЛОЖЬ». Наконец, «Только» представляет эти условия суждения, и значение ИСТИНА. строки, такие как следующий код.
Product[Category] = "Components"
Это можно понять так: добавить столбец в Productповерхность.,Определите, является ли значение [Категория] каждого продукта на поверхности Компонентами.,еслида, то возвращает TRUE,Если нет, верните ЛОЖЬ. Этот фильтр добавляется к каждой вычисляемой мере.,После фильтрации,Поверхность Только возвращает эти категории для результатов компонентов.
Нам не нужно настраивать фильтры безопасности для каждой таблицы, поскольку связи в модели будут распространять фильтр из одной таблицы в другую. Фильтры безопасности, как и метрики, учитывают контекст. Это означает, что для эффективной защиты модели необходимо всего несколько фильтров безопасности. Но имейте в виду, что изменения в модели могут нарушить политику безопасности!
На рис. 5.3 представлен простой пример с двумя таблицами. (2), они имеют отношение один-ко-многим (1). После использования роли безопасности SelectCanada, которая фильтрует столбец «Страна» по Канаде (3), таблица fSales будет фильтровать эту связь.
Рисунок 5.3. Фильтры безопасности, распространяемые через отношения
При обнаружении связи с двусторонней перекрестной фильтрацией (существовать PowerBI При фильтрации в двух направлениях да), определяется RLS Особое внимание требуется, когда。双向связьиз默认ХОРОШОдляда Распространяется только в одном направлении Безопасностьфильтр,Так как же в этом направлении? Мы можем Воля перекрестно отфильтровать направление настройки для «Single»,Такв это времяиз方向就да Безопасностьфильтриз传播方向;или ВОЗеслисвязьдаодин ко многим,Затем просто дайте направление от одной стороны ко многим сторонам.
Включить распространение фильтра Безопасности в обоих направлениях можно через окно «Редактировать связи существуют», как показано на рисунке 5.4.
Рисунок 5.4 Окно редактирования отношений
картина Продукт[Категория] = Статические фильтры безопасности, такие как «Мебель», обычно не используются в реальном бизнесе. Но да если RLS да动态из,тогда это станет полезнее,Это означает, что фильтр Безопасности может выбирать соответствующие разрешения на основе личности посетителя.
Если вам нужно загрузить, обратитесь к файлу «2.1 Row-level Security.pbix» во вспомогательных ресурсах на странице книги асинхронного сообщества. |
---|
мы можемиспользоватьDAXфункция Приходить Конечнопользовательда ВОЗ,其середина最推荐издаUSERPRINCIPALNAME。этот DAX Функция возвращает адрес электронной почты пользователя, который затем используется для обеспечения правильной логики безопасности.
предыдущий DAX функцияUSERNAMEсуществовать Power BI Сервис возвращает адрес электронной почты пользователя, но существует Power BI Рабочий стол или Analysis Services В этом примере он возвращает имя пользователя. Поскольку таким способом очень сложно определить личность пользователя, для облегчения этой задачи был введен USERPRINCIPALNAME. использовать Power BI Embedded час,Можетсуществовать Power BI Встроенная поверхность отчета существует, которая настраивается на уровне безопасности приложения (также известная как «частные данные приложения»). существуют. В этом случае самого пользователя нет, и когда дасуществовать вызовы поверхности, приложение может Power BI Укажите идентификатор(ключ)。ключ Можетдапользователь级标识符,но也Можетда Другие уровни(нравиться组织илиотделение)начальствоиз标识符。существуют В этом случае,USERPRINCIPALNAMEВоляполучение ключа,Вы можете Воля применить этот ключ к фильтру Безопасности. |
---|
но,Обычно вы не используете адрес электронной почты в качестве идентификатора пользователя во всей модели.,идаиспользоватьчисло(HR 系统серединаиз员工编号или生成изключ)。в любом случае,Вам всем нужна отдельная поверхность,Который содержит сопоставление между адресами электронной почты и идентификаторами пользователей. существуют в некоторых простых моделях,你Можетсуществоватьэтотповерхность(существовать В этом случаедаUserSecurityповерхность)и Включатьпользовательданныеизповерхность之间建立связь;или ВОЗ,Вы даже можете напрямую отфильтровать информацию о сотрудниках, используя адрес электронной почты.
Рисунок 5.5 Таблица безопасности пользователей и сотрудников
существуют в некоторых более крупных и сложных моделях,Просто защитить поверхность сотрудников может быть недостаточно. существуют В этом случае,Лучше использовать модель, в которой ни одна поверхность не устанавливает связь с UserSecurityповерхность.
Невыполнение этого требования может привести к появлению нескольких путей отношений из таблицы UserSecurity к нескольким таблицам и к некоторым неактивным связям.
использовать独立изUserSecurityповерхностьчас,Вам необходимо получить идентификатор пользователя с поверхности как часть фильтра безопасности DAX. Например,Чтобы защитить сотрудниковповерхность,Фильтр безопасности DAX должен быть таким, как показано ниже.
VAR ThisUser =
LOOKUPVALUE(
UserSecurity[EmpNr],
UserSecurity[Email],
USERPRINCIPALNAME()
)
RETURN
[EmpNr] = ThisUserRETURN
пожалуйста, обрати внимание,Вы можете существовать Фильтр безопасности DAX, используя переменные DAX. Переменная ThisUser извлекает значение EmpNr из UserSecurityповерхность.,используйте USERPRINCIPALNAME() в качестве искомого значения. За ВОЗВРАТОМ,Фильтр Воля проверяет, равно ли значение EmpNr да в текущей Сотрудницеповерхность текущей ХОРОШО переменной ThisUser,Это эффективно отфильтровывает ХОРОШО, применимое к текущему пользователю.
пожалуйста, запомни,UserSecurityповерхность содержит конфиденциальные данные,Вашему коллеге необходимо подумать, нужно ли защищать саму поверхность! Вы можете существоватьUserSecurityповерхность по настройке конкретных фильтров Безопасности.,Как показано ниже.
FALSE()
Этот фильтр сделает строки в таблице видимыми для любого пользователя. Это работает только в том случае, если таблица UserSecurity не связана с другими таблицами, поскольку этот фильтр не следует передавать остальной части модели.
пожалуйста, запомни,Фильтр безопасности да также применяется,поэтому не зависят друг от друга,Точно так же, как параметр фильтра в функции CALCULATE. это означает,Когда вы используете фильтр Безопасности выше, чтобы скрыть все ХОРОШО в UserSecurityповерхность,По-прежнему существует возможность получить текущего пользователя в другом фильтре безопасности, используя описанный выше метод. |
---|
Конечно, с РЛС не все прошло хорошо,Это также ограничивает некоторые операции при моделировании. Конкретно,Вы обнаружите, что некоторые способы использования неактивных отношений не работают.
Пожалуйста, посмотрите Рисунок 5.6из Показывать例。этот模型Включатьодин事实поверхностьfHours,其середина Включать员工из工作小час数。员工из工作小час数通常нас指издапрямые рабочие часы(Direct Hours)。но他们也把час间花существовать其他事情начальствоиз会议、взять отпуск, больной и т. д.,этот些被称дляКосвенное рабочее время(Indirect Часы). У каждого проекта есть менеджер проекта, который также является сотрудником проекта.
Рисунок 5.6 Таблица fHours (таблица рабочего времени), Таблица Project (таблица проектов) и Таблица Сотрудники (таблица сотрудников)
Если вам нужно загрузить, обратитесь к файлу «InactiveRelationship.pbix» вспомогательных ресурсов на странице книги асинхронного сообщества. |
---|
существуют В этом примере модели,прямые рабочие цифры часов могут суммироваться по проектам или по руководителям проектов, а также по сотрудникам Косвенное; рабочее время。因этот,СотрудникповерхностьifHoursповерхность имеет два отношения,Одна группа – это неактивные отношения. существуют В этом примере,fHoursиEmployeeОтношение между двумя поверхностями неактивно при настройке.
Итак, как рассчитать рабочее время в этой модели? Основная формула на самом деле очень проста, код следующий.
Direct Hours = SUM(fHours[Hours])
Так как в fHoursповерхность нет соответствующего пункта для Косвенное игровое время.,Поэтому в Проектповерхность будет добавлен пустой бланк ХОРОШО. Целью этого является обеспечение того, чтобы приведенная выше формула существовала при расчете, когда,Будут отображены пустые элементы. конечно,Вы можете получить этот результат с помощью немного более сложной формулы,Код следующий.
Direct Hours =
CALCULATE(
SUM(fHours[Hours]),
NOT(ISBLANK(fHours[ProjectNr]))
)
Так же,Аналогичный метод используется для расчета Косвенного игрового времени.,Однако на данный момент нас беспокоит пустое ХОРОШО в столбце даProjectNr. Нам нужно активировать связь fHoursиEmployeeповерхность,использоватьнравиться下код.
Indirect Hours =
CALCULATE(
SUM(fHours[Hours]),
ISBLANK(fHours[ProjectNr]),
USERELATIONSHIP(fHours[EmpNr], Employee[EmpNr])
)
По вышеуказанным мерам,Вы можете получить рабочие прямые часы Косвенное рабочее время сотрудником (обратите внимание,этотвнутрипрямые рабочие часовдапроекта, отработанное сотрудником в должности руководителя проекта), например Рисунок Как показано в 5.7.
Рисунок 5.7. Прямые и косвенные часы, отработанные сотрудником
сейчассуществовать,Допустим, вы хотите защитить эту Модель. Давайте создадим простого персонажа безопасности.,该Роль仅返回Adams,Dougрезультат.мы должнысуществовать Добавьте следующее в таблицу «Сотрудники» Фильтр безопасности DAX。
[FullName] = "Adams, Doug"
Когда эта роль безопасности активна, вы увидите ошибку, возвращаемую непосредственно из визуального элемента, как показано на рисунке 5.8.
Рисунок 5.8 Невозможно загрузить данные для этого визуального сообщения об ошибке
Это кажется странным сообщением об ошибке. fHoursповерхность имеет два отношения к Столу Работника.,Но да неактивные отношения USERELATIONSHIPиспользовать,Верно? Когда дело доходит до контекста оценки меры,Это действительно не проблема,Но это не относится к фильтру Безопасности.
на самом деле,Вам должно быть повезло, что эта ошибка произошла.,因длянас正существоватьпытаться做издаудалитьили ИзменятьfHoursповерхностьначальствоизбезопасность。нормальная ситуацияда,Соответствующее ХОРОШО мы видели только в fHours, когда руководителем проекта был Дуг. И когда использоватьUSERELATIONSHIP,Говорим модели игнорировать эти настройки,и позволяет нам получить доступ к другим ХОРОШО. В целях обеспечения безопасности данных,Модель не позволяет этого сделать. после всего,Возможность выполнить эту операцию означает, что те пользователи, у которых есть возможности самообслуживания,То есть те пользователи, которые могут писать собственные меры,Может перезаписать исходный фильтр безопасности и поставить под угрозу безопасность модели.
Это ХОРОШО очень критично, это значит безопасностьсуществовать Дизайн. модели следует добавлять с акцентом на,В противном случае легко попасть в беду. Этот внутренний пример не говорит о том, что всегда следует избегать неактивных отношений.,А даесли Воля может выявить потенциальные существующие проблемы, когда вам нужно воспользоваться безопасностью.
没иметь单一из方法Приходить解决этот个问题;этот完全取决于你из分析需求да Что。Например,Вы можете разделить поверхность Воли на две части.,один из фактовповерхностьповерхность Показыватьпрямые рабочие часы,другойповерхность Показывать Косвенное рабочее время,就картина Рисунок Как показано в 5.9.
Рисунок 5.9. Разделение таблицы фактов на fHoursDirect и fHoursIndirect.
Да,Данное решение не допускает пропуска сотрудников (так как люди, работающие над проектом,И не да менеджер проекта) получает прямое рабочее время.
Другой вариантдакопироватьEmployeeстолсодержание и Воля其命名дляProject Таблица менеджера (таблица менеджера проекта), как показано на рисунке 5.10.
Рисунок 5.10 Добавление таблицы менеджера проекта
Для этого решения требуется Project Таблицы «Менеджер» и «Сотрудник» настроены. Фильтр безопасности DAX。
существоватьдизайн Безопасность Стратегия之назад,Вам определенно нужны эти стратегии тоже,Чтобы увидеть, работают ли они по плану. Счастливчик да,Power BI Desktop и Power BI Все службы имеют функцию «просмотра по роли», которая позволяет просматривать данные, видимые в определенной роли.
Использовать опцию «Просмотреть как» позволяет имитировать вход конкретного пользователя и проверять, что этот пользователь может видеть. существовать Power BI Desktop , операция очень простая: например Рисунок 5.11所Показывать,существуют в окне «Просмотр как персонаж»,Выберите персонажа, которого хотите протестировать,Также доступна опция «Другие пользователи». В поле существования вы можете ввести адрес электронной почты пользователя, которого хотите протестировать.
Рисунок 5.11 Окно «Просмотр как роль» в Power BI Desktop
существовать Power BI В Сервисе это работает в основном так же, но опция «Другие пользователи» немного скрыта. существуют Набор Когда в данных выбрано «безопасность», нажмите на три точки справа от символа «Безопасность» и выберите «Ввести ХОРОШОтест как символ», как показано на рисунке. Как показано в 5.12.
Рисунок 5.12 Параметр «Тестировать как роль» в сервисе Power BI
При просмотре поверхности отчета как символа,Нажмите на роль еще раз,существуют Вверху синий "Я сейчас просматриваю как" там,Как показано на рисунке 5.13.,При желании вы можете ввести адрес электронной почты пользователя, которого хотите выдать за себя.
Рисунок 5.13. Выбор человека для моделирования
тест RLS При сохранении существует один предел: если опубликовано Power BI Модель использует живое соединение, поэтому вы не можете легко ее редактировать, поскольку модель, о которой сообщается, находится в разных файлах. Это действительно проблема, поскольку «живые соединения» являются распространенным методом развертывания отчетов. В следующем разделе мы Воляпред проводим тест использования живого соединения. RLS метод, который позволяет тестировщикам легко выдавать себя за любого пользователя.
существовать许多部署 Power BI В подотчетной организации сотрудники технической поддержки будут получать вопросы от пользователей. Например: «Я не вижу никаких данных в моем отчете о существовании поверхности» или да «Я должен увидеть X и Да, но могу только видеть X, ох, и Z». Есть и более серьезные случаи: «Джон должен был увидеть Право». Power BI 模型из编辑权限),Чтобы прояснить эти вопросы, нам, возможно, придется переосмыслить стратегию безопасности. В любом случае,Также было бы полезно иметь возможность моделировать то, что на самом деле видит пользователь в своих отчетах.
Что-то, что нужно напомнить да,Вы хотите иметь возможность выполнить эту операцию в производственной версии (версии, которая фактически используется во всей организации).,Поэтому необходимо добиться того, чтобы сама симуляция была да Безопасность. другими словами,Это действие должно быть ограничено конкретными пользователями (например, сотрудниками службы поддержки).,Однако обычные пользователи не могут получить к нему доступ. также,существования Должно быть удобно переключать моделируемых персонажей в производственной среде.,Это означает, что модель Power BI, соответствующую текущей поверхности, следует использовать вместе.
Решение этой проблемы содержит ряд конкретных элементов, а именно:
Давайте сделаем это снова.
Начнем с очень простой модели. Единственный его элемент — параметр да Запрос, pImpersonation.
Рисунок 5.14 существовать Параметры управленияокносередина输入Запросженьшень数
Рисунок 5.15. Таблица олицетворения.
Если вам нужно загрузить, обратитесь к файлу «2.1 Impersonation.pbix» во вспомогательных ресурсах на странице книги асинхронного сообщества. |
---|
существоватьнуждатьсятестиз原始 Power BI В модели текущее существование можно получить с помощью следующих шагов: DirectQuery способ подключения к таблице pImpersonation. Модель станет составной моделью.
Рисунок 5.16. Таблица pImpersonation добавлена в модель.
Затем создайте новую роль безопасности UserTest, которая будет проверять олицетворение. ценить. Если он содержит действующий адрес электронной почты, то фильтр Безопасности Воля использует этот адрес электронной почты, чтобы выдать себя за пользователя. если значение пустое, Фильтр применяться не будет. безопасности.
Например,Следующий код даEmployeeстол адаптирует Фильтр безопасности.
VAR Impersonation =
SELECTEDVALUE(pImpersonation[pImpersonation])
VAR User =
LOOKUPVALUE(
UserSecurity[EmpNr],
UserSecurity[Email],
Impersonation
)
RETURN
ISBLANK(User) || [EmpNr] = User
Первая переменнаяImpersonationиспользовать SELECTEDVALUE Извлекает значение параметра pImpersonation (столбец в этой модели). SELECTEDVALUE обычно используется для получения значения из столбца.,если в столбце есть уникальное значение для Только; в этом случае существует,Итого да Только имеет значение,因длясуществоватьpImpersonationповерхностьсередина Толькоесть один ХОРОШО。
вторая переменнаяUserпытатьсяиспользоватьLOOKUPVALUEотUserSecurityповерхностьсередина检索EmpNrценить。пожалуйста, обрати внимание,UserSecurity используется для преобразования адреса электронной почты пользователя Воля в идентификатор пользователя, если найдено значение EmpNr;,Затем Безопасность оставшейся части фильтра Воляиспользовать это значение.
пожалуйста, обрати внимание,когдаpImpersonationдлянулевой白ценитьили电子邮件地址无效час,LOOKUPVALUEВоля возвращается в BLANK. существуют В этом случае,мы не хотим входить ХОРОШОлюбой фильтр。代码из最назад一ХОРОШОISBLANK(User))||[EmpNr] = Пользователь, что означает да. Когда переменная Пользователь пуста, значение ISBLANK(Пользователь) истинно для каждого ХОРОШО на поверхности. если, но не да, формула применяется только к столбцам EmpNr Возвращает true для строки, содержащей полученное значение пользователя.
После введения в действие новой роли «Безопасность»,Теперь вы можете опубликовать модель. но,Чтобы смоделированный персонаж работал,Вам все еще нужно позаботиться о нескольких вещах.
Чтобы выдать себя за пользователя и сообщить о поверхности, PBITestUser Вам следует войти в систему Power BI, перейдите к Impersonation Набор данных,Затем Воля Набор данныхнастраивать下изpImpersonationженьшень数ценить Изменятьдляхотеть模拟из电子邮件地址。Не забывайте, что вам необходимо обновить набор смоделированных данных после изменения значений параметров.。由于该женьшень数да模型середина唯一из内容,Поэтому обновление существования может быть завершено в одно мгновение. Следующий,оказатьсяи PBITestUser общий отчет и откройте его.
Поскольку модель газетного стола и Impersonationда использует метод подключения DirectQuery.,Следовательно, значение параметра можно использовать сразу после его изменения. Роль безопасности Воля выберите адрес электронной почты и соответствующим образом отфильтруйте отчет. пожалуйста, обрати внимание,Вообще говоря,существует пользователь существует при первом подключении к модели во время сеанса входа в систему,Применен фильтр безопасности. Измените параметры при просмотре поверхности отчета.,Новое значение не принимается сразу. Напротив,Пожалуйста, выйдите из отчета и подождите некоторое время, прежде чем вернуться (существовать наш тест).,Около 10 минут вполне достаточно).
если бы только PBITestUser да UserTest Роль единственной учетной записи в этом методе — да Безопасность. Поскольку другого символа нет, используйте значение pImpersonation, ImpersonationНабор данные даже не нужно защищать, ведь это всего лишь адрес электронной почты.
Для разных персонажей безопасности таким образом протестируйте,Для каждого символа Безопасности, определенного в модели, можно создать специальный тестовый символ. так,你甚至Можетпроходить Воля PBITestUser Добавьте к соответствующей тестовой роли, чтобы проверить, что происходит, когда пользователь является участником нескольких ролей.
У нас есть отдельная тестовая рабочая область для размещения набора олицетворений. данных, но вы можете решить эту проблему другими способами. Важные да,тестовые пользователи должны обратить внимание на этот набор. данных具иметь读取доступ权限,и не должен иметь полного доступа к модели для тестирования (например,,成для模型所существовать工作区из管理员)。этотда因для作для工作区管理员、членилиженьшеньи ВОЗ,Роль Безопасность не будет применена. |
---|
до сих пор,Мы обсудили возможности и некоторые подводные камни защиты данных на основе личности пользователя. Приведенное выше обсуждение предполагает, что данные каким-то образом напрямую связаны с пользователем. существует много ситуаций,Это далеко не достаточно,Потому что пользователь является частью более крупной организации с определенной структурой. Следующий раздел Воляпред творит подобные ситуации.
существуют в большинстве организаций,Данные не связаны напрямую с одним пользователем, имеющим доступ к данным. Напротив,есть один群人每个人都Можетдоступ Нет同изнабор Например, менеджеры могут получить доступ к данным подчиненных им сотрудников. ДАКС Содержит набор функций для обработки иерархий «родители-потомки», а именно: Функции PATH.
первый,Давайте посмотрим на типичную организационную структуру.,существовать В этом случае,Организационная структура нашей компании QuantoBikes. QuantoBikes состоит из нескольких подразделений, ориентированных на континенты.,Каждый отдел состоит из нескольких команд.
Организационная структура представлена на рисунке 5.17.
Рисунок 5.17 Организационная структура QuantoBikes
нравиться Рисунок 5.18所Показывать,существовать Employee таблице, эта организационная иерархия представлена функцией с именем MngrNr или столбец номера менеджера для идентификации. В этом столбце указан номер сотрудника непосредственного руководителя каждого сотрудника, только должность генерального директора не имеет соответствующего руководителя;
Рисунок 5.18 Таблица сотрудников QuantoBikes
Power BI предполагает, что у сотрудника нет нескольких прямых менеджеров.,Это разумное предположение. Бывают случаи, когда вам может потребоваться иметь дело с иерархиями с несколькими родителями (например,,Генеалогия): Эти ситуации слишком сложны.,Невозможно решить проблему только с помощью функции PATH. Мы не будем существоватьпредставлять это содержание в этой книге. Когда несколько родительских столбцов ХОРОШОсуществовать на поверхности содержат пустые значения,Иерархия может состоять из нескольких деревьев. |
---|
еслинасдизайнодин кусочекповерхность,Перестановка иерархии родитель-потомок на поверхности,Тогда вы сможете получить поверхность, содержащую всю информацию. житьнаш пример,Относится к да от сотрудника к менеджеру,менеджеру менеджера,一直到层次结构из顶部。DAX Содержит ряд функций, которые делают это за вас и предоставляют полезную информацию об иерархиях.
PATH(Employee[EmpNr],Employee[MngrNr])долженсуществовать Employee Вычисления выполняются в контексте строки таблицы. Он принимает два столбца иерархии в качестве аргументов и возвращает порядок от вершины иерархии к текущему. EmpNr путь. Результатом является текстовая строка, содержащая все EmpNr конкатенация значений. Например, Лео Джонсон (сотрудник 10106) показано ниже.
10001|10010|10101|10106
пожалуйста, обрати внимание,Путь всегда датекст,Это верно, даже если в иерархии указаны числа.
функция PATHCONTAINS Воля пути и значения в качестве параметра возвращает TRUE, если значение содержит существующий путь. снова Лео Джонсон является примером. Результатом следующего кода является TRUE.
PATHCONTAINS(
<Leo's path>,
10010
)
функция PATHLENGTH Возвращает количество элементов в пути. Другими словами, он возвращает уровень иерархии, на котором находится текущий элемент. Например, следующий код вернет значение 4。
PATHLENGTH(<Leo's path>)
ФункцияPATHITEM принимает в качестве параметра путь и номер N.,返回层次结构от头计数(или层次结构из顶部)из第 N элемент. Например, следующий код возвращает 10101.
PATHITEM(<Leo's path>, 3)
5.PATHITEMREVERSE
Функции PATHITEMREVERSE и PATHITEM аналогичны, но начинают отсчет с конца пути (нижней части иерархии).
PATHITEMREVERSE(<Leo's path>, 3)
Вышеупомянутое возвращает 10010, который является кодом межуровневого менеджера даLeo.
такой же,пожалуйста, обрати внимание,PATHITEMиPATHITEMREVERSE возвращает текстовое значение,Это верно, даже если путь создан на основе числового значения.
Обычное использование PATH Функция даиспользовать PATH Создать путь,А Воля используется как вход для другой функции. Но да,Вы можете создать строку пути любым удобным для вас способом. Функция PATH не имеет каких-либо скрытых сведений о том, как создаются пути; они только обрабатывают текстовые строки и ищут символы вертикальной черты; |
---|
Когда данные имеют иерархическую структуру,МожетиспользоватьPATHфункциявыполнить更复杂из Безопасностьлогика。Предположим, вы хотите, чтобы менеджер имел прямойили间接获取下属所иметь员工изданные Безопасность Стратегия。первыйнуждатьсясуществоватьEmployeeповерхностьсередина创建один列,который содержит путь иерархии для каждого сотрудника,следующее.
Path = PATH([empNr], [MngrNr])
в таблице «Сотрудники» Фильтр безопасности DAXВоля повторно извлекает номер сотрудника вошедшего в систему пользователя.,Код следующий.
VAR ThisUser =
LOOKUPVALUE(
serSecurity[EmpNr],
UserSecurity[Email],
USERPRINCIPALNAME()
)
Далее да проверяет, находится ли текущий пользователь да на пути существования сотрудника.
RETURN
PATHCONTAINS([Path], ThisUser)
Когда вошедший в систему пользователь находится на пути сотрудника,Функция PATHCONTAINS возвращает TRUE,В противном случае возвращается ЛОЖЬ. Поэтому результаты фильтра Безопасности да,Виден всем сотрудникам в иерархии ниже пользователя.,И да невидим для других сотрудников.
Умело используя функцию PATH,Вы можете настроить различные расширенные правила безопасности. Далее давайте посмотрим на пример,Давайте создадим политику, в которой менеджер сможет просматривать данные обо всех сотрудниках, которые подчиняются ему, и всех сотрудниках, которые подчиняются его коллегам. Подробности ниже иллюстрировать.
нас Волянуждаться相когда多из代码Приходитьвыполнитьэтот Стратегия,и会использовать DAX Переменные для записи процесса выполнения программы. Код охватывает следующие шаги.
Сначала разберемся, как определить John да Но - менеджер. Это было нелегко, потому что путь отчетности мог идти вверх, а организационной структуры у нас не было. Но да, мы можем пройти Employee таблица и расчет John Число раз существования появляется на пути. Люди, которые не являются менеджерами, будут появляться только на своем пути восходящей отчетности и не будут появляться на пути других. Чтобы использовать функцию PATH, нам сначала нужно получить из UserSecurityповерхность. John номер сотрудника. Ниже да DAX код.
VAR ThisUser=
LOOKUPVALUE(
UserSecurity[EmpNr],
UserSecurity[Email],
USERPRINCIPALNAME()
)
VAR IsManager=
IF(
COUNTROWS(
FILTER(Employee,
PATHCONTAINS(Employee[Path],ThisUser)
)
)>1,
TRUE(),
FALSE()
)
Когда пользователь даадминистратор, переменная IsManager имеет значение TRUE. Мы можем продолжать искать John лицо, сообщающее информацию, но согласно нашей стратегии, Джон Может Проверять直接или间接向其经理汇报工作из员工данные。因этот,Глядя на менеджера Джона, можно сказать, что на этом пути не существует ни одного сотрудника. WeuseLOOKUPVALUE извлекает значение MngrNr вошедшего в систему пользователя (переменная ThisUser).,thenusePATHCONTAINS проверяет, появляется ли менеджер Джона в пути существующего сотрудника.,Код следующий.
VAR ThisUserMngr=
LOOKUPVALUE(
Employee[MngrNr],
Employee[EmpNr],
ThisUser
)
VAR ReportsToManager=PATHCONTAINS([Path],ThisUserMngr)
Еслииспользовать переменную ReportsToManager, мы выберем слишком много сотрудников. Нам следует пропустить менеджера Джона и Джона Того. же уровня Для этого необходим Джон и только ранг его менеджера больше; John Сотрудники должны быть как минимум на два уровня ниже менеджера, чтобы быть John Проверять。你МожетиспользоватьPATHLENGTHфункция Приходить执ХОРОШОэтот操作,Код следующий.
VAR ThisUserPath=
LOOKUPVALUE(
Employee[Path],
Employee[EmpNr],
ThisUser
)
VAR MngrLevel=PATHLENGTH(ThisUserPath)–1
пожалуйста, обрати внимание,Фильтр безопасности да с Сотрудникомповерхность в качестве объекта итерации,существования Каждый раз, когда рассчитывается ХОРОШО, мы хотим получить уровень Джона-менеджера. С этой информацией,Затем мы можем сделать вывод, какие сотрудники должны быть видимыми.,Код следующий.
VAR ShouldBeVisible=
ReportsToManager
&& PATHLENGTH([Path]) >= MngrLevel+2
Даэтот处нуждаться留意一下:есть один个员工изShouldBeVisibleценить返回FALSE,И этот сотрудник действительно должен быть виден. Потом да Джон сам. поэтому,Нам нужно провести тонкую настройку вышеуказанных переменных.,Код следующий.
VAR ShouldBeVisible=
(ReportsToManager
&& PATHLENGTH([Path]) >= MngrLevel+2)
||[EmpNr]=ThisUser
сейчассуществовать,Мы можем Воля объединить весь существующий контент воедино.,Заканчивать Безопасностьфильтризнастраивать,Код следующий.
RETURN
IF(
IsManager,
ShouldBeVisible,
[EmpNr]=ThisUser
)
Есть еще одна важная ситуация, которая может пойти не так: генеральный директор,Потому что у него нет вышестоящего менеджера,В результате дахе Только может видеть себя. Это связано с тем, что переменная ThisUserMngr пуста.,Таким образом, в конце концов ни один сотрудник не подотчетен ей;,Отсутствие пути приведет к пустому значению.,Поэтому переменная ReportsToManager имеет значение FALSE для любого сотрудника. с этой целью,Нам нужно добавить новую переменную, чтобы обнаружить такую ситуацию: когда у пользователя нет начальника,MngrLevel равен нулю. поэтому,最终изфильтр应да Как показано ниже.
RETURN
SWITCH(TRUE(),
MngrLevel=0,TRUE(),
IsManager,ShouldBeVisible,
[EmpNr]=ThisUser
)
этотвнутриSWITCHзаявлениепервый检查пользовательда否для首席执ХОРОШОчиновник,еслида,вы можете просмотреть всех сотрудников;,Он проверяет, является ли пользователь да менеджером.,еслида,Просто примените правило безопасности менеджера. если пользователь не является ни генеральным директором, ни менеджером,Тогда Только позволяет пользователям видеть себя.
Теперь, когда вы полностью понимаете Безопасность на уровне Практическое применение строк, мы, Воля, обсуждаем, как их использовать. RLS Реализация более сложных политик безопасности: атрибуты защиты и защита на совокупном уровне, описанные далее в этой главе.
существовать本节середина,У нас Воля совершенно по-другому стоит в модели Power BI. существуют в передней части,нас重点представлятьограниченная модельповерхностьсерединаверно“ХОРОШО”да否видимыйиз方法,Это наиболее распространенное требование безопасности. Однако в реальных бизнес-сценариях будут существовать и другие формы потребностей в безопасности. если Воля Безопасность на уровне строки рассматривается как «горизонтальная» безопасность,Тогда имеет смысл рассмотреть и «вертикальную» безопасность. другими словами,насда否Может Защищать列илисвойство?
Толькоиметькогдаиспользовать Power BI Модель действительно нужна только тогда, когда группа людей больше. RLS Защитите свою модель только у руководителей. Используйте, возможно, она вам вообще не понадобится. СБН. Потому что каждый пользователь может просмотреть все данные. Только по мере того, как ваша аудитория становится больше, возникает необходимость сегментировать ваши данные на основе географии, сегментации клиентов или, как описано в предыдущей главе, организационной структуры.
такой же,если ваша модель применима только к конкретным бизнес-процессам (например, продажам и управлению возможностями),Нет необходимости защищать определенные атрибуты. Например,Модель может содержать имя продавца и его обязанности.,но Нет Включать他们из工资уровень、Дата рожденияилиномер социального страхования。когдаиметь关Нет同业务流程изданные组合到один模型серединачас,Например, данные о продажах и управлении персоналом.,Вам необходимо включить другие атрибуты, которые не являются общими для пользователей.
Защитные свойстваиз一种方法дауровень объектабезопасность(Object-level безопасность), имеет следующие две формы.
насиметь意识地существоватьэтот里использовать"пропадать"этот个词。Например,когдаиспользоватьповерхностьуровеньбезопасность ЗащищатьProductповерхностьчас,Модель ведет себя так, как будто поверхность продукта вообще отсутствует. При использовании уровня столбца безопасность защищает столбец,Аналогичный эффект произойдет.
Мы не будем здесь подробно останавливаться на всех аспектах безопасности на уровне объекта.,Одна из причин, по которой дайт дасуществовать не используется в случае DAX-калибровки. В этой книге основное внимание уделяется методу управления государством, о котором будет упомянуто позже. конечно,использовать безопасность уровня объекта также в особых случаях. В официальной документации указано,Он ограничивает доступ к «конфиденциальным» именам поверхностей.,иногда,У вас могут быть такие данные,Они настолько чувствительны, что даже имена поверхностей нужно ограничивать лишь несколькими конкретными людьми.,Не говоря уже о содержании. (Почему именно в это время я придумал название поверхности: НЛОтип,Ха-ха,Но я думаю, что должны быть и более серьезные примеры).
Да,поверхностьи列из消失会给 Power BI Модель и сообщаемая поверхность создают новые проблемы. При установлении связи с обычной защищенной поверхностью поверхность у вас может не получиться к ней доступ из-за проблем с разрешениями. Что еще более важно, при ссылке на защищенный столбец или столбец на защищенной поверхности Power Отчеты BI выдают ошибки, поскольку они не могут получить доступ к этим столбцам или таблицам.
Другими словами,использовать безопасность уровня объекта заставит вас разделить Воляповерхность на пользовательские версии, имеющие доступ к объекту Безопасность.,и пользовательская версия без прав доступа.
С этим,ты, возможно, думаешь,Для защищенных данных,использовать отдельную модель не лучше? после всего,Это будет только обычная газетная поверхностьиспользовать.
хотя Power BI Поддержка модели OLS, но в данный момент недоступен использовать Power BI Desktop Настройте его. |
---|
сейчассуществовать,Мы представляем несколько иной подход к Защитным свойствам.,它Можетсуществоватьодин кусочек报поверхностьсерединавыполнить允许доступизпользовательи Нет允许доступизпользователь同часиспользовать。нас创造了术语ценитьуровеньбезопасность(value-level security,VLS),Потому что это смесь уровня да ХОРОШО и уровня безопасности столбца. использовать уровень значения безопасности,Пользователю может быть предоставлен доступ к значениям определенных столбцов в ХОРОШО.,Но к значениям столбцов в других ХОРОШО доступ невозможен.
проходитьиспользовать VLS,Вы можете реализовать стратегию Безопасности,Например: Менеджеры могут видеть уровни заработной платы подчиненных им сотрудников.,Но я не вижу, чтобы уровень заработной платы сотрудника сообщался коллегам.,Даже если они видят этих сотрудников и их показатели продаж. В другом совершенно другом примере ситуация может быть следующей: учитель видит имя ученика.,Цифры и результаты,Но Только может видеть адрес ученика только в том случае, если требуется классный руководитель. Учителя, которые являются классными руководителями определенных учащихся, могут видеть их адреса.,Но я не вижу адресов других студентов.
Вы можете использовать DAX Для этого значения метрик поступают в адаптивную систему. Но в долгосрочной перспективе это не решение. если пользователь получил Power BI Разрешения на разработку модели, чтобы они могли создавать свои собственные отчеты. (Это даиспользовать Power BI ситуации, которые часто могут возникнуть в процессе), Вы также можете создать свой собственный DAX Значение измерения. Таким образом, они имеют свободный доступ ко всему, что в модели не защищено. Это означает, что любую безопасность, реализованную в виде значения метрики, можно обойти, создав метрику.
Важнее да,один严肃из模型Может Включать数十个или数百个度量ценить。когда每个度量都нуждаться配备логика Приходитьвыполнитьсвойствобезопасность,Ваша вероятность совершить ошибку внезапно возрастет.,Затраты на техническое обслуживание также останутся высокими. Напротив,Мы надеемся, что есть решение,Эту схему можно применить к любой мере модели.
выполнить VLS Нужно смоделировать Фильтр безопасности Сложная комбинация DAX. В следующем разделе мы, Воля, сосредоточим внимание на этом содержании.
Если вам нужно загрузить, обратитесь к файлу «2.1 Value-levelsecurity.pbix» вспомогательных ресурсов на странице асинхронной книги сообщества. |
---|
дизайн VLS Когда дело доходит до решений, вам сначала нужно знать, как выглядит отчет о безопасности поверхности. Нам не нужна дезинформация, поэтому Рисунок Лучший выбор для визуальных объектов в версии 5.19. существуют В данном примере SSN сотрудника отдела Отображается правильно, остальные сотрудники отображаются пустыми.
Рисунок 5.19 Отчет, защищенный VLS
Здесь нужно обратить внимание на что-то особенное.,к Защищенное значение существует в отчете не отображается. Но существуют в этом примере,Результаты из-за метки столбца SSN, но не измеримого значения,因этот模型серединадолженесть один个ценить才能существовать视觉верно象середина显Показывать。этот Можетданулевойтекст、BLANKценитьили其他ценить,И ценность должна фактически храниться в существовании в столе ХОРОШО.
сейчассуществовать,если вы понимаете, что для некоторых пользователей,Эти значения должны быть видны,И для других пользователей,Затем защищенная поверхность Воля (существовать в данном случае Сотрудник) разбивается на две части: одна для общедоступных колонок (разумеется,к RLS ограниченные ограничения), а другая часть содержит частные столбцы, как показано на рисунке 5.20.
Рисунок 5.20 Воля Поверхность сотрудника разделена на публичную и приватную части
Нам еще нужны Воля соответствующие взаимные ссылки ХОРОШО,Потому что у нас существуют колонки EmpNr на обеих поверхностях. Вы можете создать связь между двумя поверхностями.,Эта связь даже один к одному. Но нам это не поможет,Вместо этого он, конечно, не предоставляет пустые значения для частных столбцов;,Это возвращает нас к ситуации, когда «Только» находится за столом.
Решение да Добавить ХОРОШО на частную поверхность. Для сотрудниковповерхность,Поверхность сотрудника (частная) должна содержать в два раза больше ХОРОШО, чем стол даEmployee. Мы с Воля делимся на две группы,Набор ХОРОШО содержит все значения EmpNr,и все личные данные,нас Воляэтот些ХОРОШО称для正ХОРОШО。
Другой набор ХОРОШО также содержит все значения EmpNr,носуществовать私иметь列серединаданулевой白ценить(или你выбиратьиз任何其他显Показывать方式),нас Воляэтот些ХОРОШО称для负ХОРОШО。дополнительные столбцы Private Помогает отличить положительное ХОРОШО и отрицательное ХОРОШО. Рисунок 5.21 показывает это схематически.
Рисунок 5.21 Добавление строк в таблицу «Сотрудник (частный)»
Employee (Частная) таблица связана с таблицей «Сотрудник» отношением «многие к одному», где «Сотрудник» (частный) находится на «многих» концах отношений. Для этой связи необходимо включить перекрестную фильтрацию в обоих направлениях. Например, при выборе сотрудника по полному имени вы хотите выбрать личные данные этого сотрудника. И наоборот: существование. При выборе уровня оплаты вы хотите выбрать всех сотрудников с этим уровнем оплаты. Поэтому фильтры необходимо распространять от сотрудников к Employee (частное) и наоборот.
Можетиспользовать M Скрипт для простого создания промежуточной поверхности (этот скрипт предполагает, что у вас есть Запрос sEmployee, которым является Запрос). Employee поверхность предоставляет базовые данные, а сам Запрос в модель не загружается).
letSource = sEmployee,PositiveRows = Table.SelectColumns(Source,{"EmpNr", "SSN", "DateOfBirth", "PayLevel"}),AddPrivate = Table.AddColumn(PositiveRows,"Private", each 1, Int64.Type),NegativeRows = Table.SelectColumns(Source,{"EmpNr"}),AddPrivate2 = Table.AddColumn(NegativeRows,"Private", each 0, Int64.Type),Combine = Table.Combine({AddPrivate, AddPrivate2})inCombine
Этот скрипт создает sEmployee стол Две копии: одна содержит частный столбец, а другая — только столбец EmpNr. Частный Столбцы Воля добавлены к значениям 1 или 0 из двух экземпляров. Наконец, добавьте Запрос к двум копиям.
добавить в其他列可能很иметь用。Например,если для существования частной собственности стратегии безопасности использовать организационную иерархию,Тогда существуют две копии и содержат значимый столбец MngrNr.
Убедитесь, что не включен параметр «Существовать Применить фильтр Безопасности» в обоих направлениях на существующих отношениях. Как вы увидите в следующем разделе, мы используем фильтр «Безопасность» для «Сотрудник(частный)» для защиты частной собственности. Это правильно Сотрудникстол Безопасность фильтра-дополнения. существуют В этом случае модель не допускает распространения в направлении, противоположном направлению по умолчанию. безопасности.
когда你использоватьEmployee и Столбец в разделе «Сотрудник(частный)поверхность» При создании выходных данных вы заметите, что для каждого сотрудника существует две копии выходных данных: одна с фактическими личными атрибутами (положительная копия) и одна с пустыми частными атрибутами (негативная копия). Причина такой ситуации данаш дизайн Сотрудник (частный)стол таким образом, как Рисунок Как показано в 5.22.
Рисунок 5.22. Просмотр двух выходных строк для каждого сотрудника
Но это значит, что теперь можно продолжать использовать Безопасность. на уровне строк Приходитьвыбиратьхотеть显Показыватьиз副本。верно于其私иметьсвойство应видимыйиз每个员工,Убедитесь, что соответствующее положительное значение ХОРОШО в поле «Сотрудник(частный)» видно.,Также скройте отрицательные значения ХОРОШО. За каждого сотрудника, чья личная собственность не должна отображаться,использовать непустое частное свойство скрывает положительные значения ХОРОШО в Сотруднике(частный),И сделайте отрицательное значение ХОРОШО видимым.
Формула DAX для фильтра безопасности для сотрудника (частный) показана ниже.
(
<when to show>
&& [Private] = 1
)
|| (
NOT(<when to show>)
&& [Private] = 0
)
нас Воляпервый<when to show>子句称для正子句,Второе предложение называется отрицательным. Например,Чтобы отобразить только личные свойства сотрудника 10203,фильтр Волядляследующее.
(
[EmpNr]=10203
&&[Private]=1
)
||(
[EmpNr]<>10203
&&[Private]=0
)
Это выражение применимо к EmpNr = Единичные личные данные ХОРОШОи для 10203, и с другими значениями (для EmpNr
и пустое значение) ХОРОШО. Для всех остальных ХОРОШО в Сотруднике(частном) выражение поверхности является ложным, и строки скрыты.
как вы видете,за каждого сотрудника,Employee(private)середина Толькоесть один ХОРОШОвидимый。Можетпроходитьнастраиватьбезопасность Приходить隐藏根本Нет应该видимыйиз员工картина往常一样существоватьEmployeeповерхность Добиться прогресса ХОРОШОфильтр。еслисуществоватьEmployeeначальствонастраивать Безопасностьфильтр [MngrNr] = 10201, вы получите результат, показанный на рисунке 5.23 (Фаустина Bailey да Сотрудники 10203)。
Рисунок 5.23 Просмотр SSN сотрудника
существование Частный стол Фильтр Безопасность, который вы можете использовать как обычно DAX Примените весь возможный контент в формате . Например, чтобы иметь такую политику «Безопасность»: «Менеджеры могут видеть частные атрибуты своих прямых подчиненных, но не атрибуты своих косвенных подчиненных», вам необходимо сначала иметь существующую «Сотрудник(частный)поверхность». MngrNr и Path этот两列。стол Безопасностьфильтрсерединаиз第一步да检索пользователь,Код следующий.
VAR ThisUser =
LOOKUPVALUE(
UserSecurity[EmpNr],
UserSecurity[Email],
USERPRINCIPALNAME()
)
Следующий,Конечно, путь пользователя и уровень организации,Код следующий.
VAR ThisUserPath =
LOOKUPVALUE(
'Employee (private)'[Path],
'Employee (private)'[EmpNr],
ThisUser
)
VAR ThisUserLevel = PATHLENGTH(ThisUserPath)
«Только имеет поверхность прямого подчинения» означает да: сотрудник, который отчитывается перед этим пользователем (пользователь оказывается существующим на его пути), а также да прямой подчиненный (чей уровень на один уровень ниже уровня человека, отчитывающегося использовать) . Выберите этот запрос для формулы DAX следующим образом.
PATHCONTAINS([Path], ThisUser)
&& PATHLENGTH([Path]) <= ThisUserLevel + 1
пожалуйста, обрати внимание,этот处использовать“<=” (и Нетда Толькоиметь“=”),Назначение Для того, чтобы содержать ThisUser,Эта Пользовательда — единственный сотрудник на своем пути, который находится на одном уровне с ней (по определению,ThisUserНет属于уровень小于илиуровень高于ThisUserLevelиз任何员工из路径,Поэтому высшие менеджеры не включены). поэтому,верноEmployee(private)изфильтр Воляда Как показано ниже.
RETURN
(
PATHCONTAINS([Path], ThisUser)
&& PATHLENGTH([Path]) <= ThisUserLevel + 1
&& [Private] = 1
)
||
(
NOT(
PATHCONTAINS([Path], ThisUser)
&& PATHLENGTH([Path]) <= ThisUserLevel + 1
)
&& [Private] = 0
)
Не забывайте существовать PATHCONTAINS Пункт и PATHLENGTH 子句начальствоиспользовать NOT Функция, обратите особое внимание на кронштейны!
до сих пор,Предположим, что существует набор атрибутов сотрудника: частный,А пользователи, которые могут видеть личную собственность некоторых сотрудников, могут видеть всю их личную собственность. ты можешь сделать еще один шаг вперед,Определите несколько наборов частных свойств,Например,Воля общедоступные свойства и контактные данные отдельно,Для того же уровняиспользовать,И только это отдельные HR-атрибуты, которые может просмотреть руководитель. Но да,Будьте осторожны: так много сложной логики и операций.,Модели могут быстро стать чрезвычайно сложными.,что затрудняет управление,конечно. Эти операции также влияют на производительность модели.
Но при необходимости вы можете скопировать эту структуру для хранения нескольких наборов частных свойств. Модель можно создать, как показано на рисунке 5.24.
Рисунок 5.24. Установка нескольких наборов частных атрибутов
两个私иметьповерхностьсвязаны непосредственно с общественностьюповерхность。верноэтотнастраиватьназад,你Можетпроходить Воля RLS Фильтры применяются к соответствующим таблицам для независимой защиты этих двух наборов частных свойств. Аналогично на общем столе RLS Определите, какие строки полностью видимы.
Самая большая проблема да заключается в том, чтобы включить VLS из模型开发报поверхностьбудет запутанно。正нравитьсянассуществоватьначальство一节середина所看到из,Когда у вас есть полный доступ к модели,Всякий раз, когда сообщается о жизнеспособности поверхности, используйте частную собственность.,都会верно ХОРОШОВходить ХОРОШОкопировать。
существуют при работе внутри самой модели,Простой способ разгрузить личный стол негатива ХОРОШО. так,Вы Воля смотрите все частные объекты,По крайней мере, дубликатов вы не увидите. Лучший способ выполнить эту операцию — даиспользовать параметр для настройки — загрузить отрицательный ХОРОШО. так,Вы можете переключить все частные поверхности одновременно, изменив значение параметра.
Другой способ — создать поверхность разработки, содержащую значение 0и1. Частная колонка. Затем вы можете создать все частные таблицы из Development стол Private связь между столбцами. Это позволит вам сообщить о поверхности в фильтре настройки (Разработка[Частный]) = 1) закрыть все отрицательные строки. Таким образом, вы можете легко переключиться с отчета, не раскрывая саму частную таблицу, как показано на рисунке 5.25.
Рисунок 5.25 Создание и приватная поверхность Связанная поверхность разработки
использовать эти методы,Вы можете просматривать данные как пользователь и одновременно создавать отчеты. Вам все равно нужно убедиться, что пользователи не видят все данные.,因для他们верно Power BI Модель имеет права на редактирование.
Безопасность на уровне Другое применение строк — защита совокупного уровня, что обсуждается в следующем разделе ХОРОШОпред. Вы можете использовать методы, аналогичные Защитным. свойства,нотакой жеесть один些注意事项。
Еще одно условие модели Power BI Безопасность связано с уровнем агрегации. У вас может возникнуть такое требование: «Расходы на зарплату можно посмотреть по команде,Однако зарплату отдельных сотрудников может посмотреть их непосредственный руководитель." существуют в этом разделе.,Мы, Воля, изучаем варианты, обеспечивающие существование просмотров результатов на разных уровнях агрегирования.
Мы уже упоминали об этом ранее в этой главе: существуют меры, принятые в DAX выполнитьбезопасностьда Нет Безопасностьиз。существоватьдизайн模型час,Всегда следует учитывать возможные потребности пользователей самообслуживания.,Пользователь Воля может написать свои собственные меры против модели. так,Вам не придется усердно работать над существующими измерениями. Безопасность.
Вместо этого безопасность должна полагаться только на структуру модели. RLS。этот意味着и Нетда你能想到из每个Безопасность Стратегия都Можетвыполнить。Например,Ваши пользователи могут запросить просмотр информации о продажах на индивидуальной основе.,Но Только может просматривать прибыль от продаж по командам. Поскольку обе меры рассчитываются на основе одних и тех же фактических данных,Поэтому эта потребность не может быть удовлетворена. существуютдругие ситуации,данные取自Нет同из事实поверхность(Например,Продажи на человека,Да стоимость зарплаты по команде).
Убедитесь, что зарплаты могут просматриваться командой, а не сотрудником.,Самый безопасный метод – это не существующая загрузка этих данных на уровне сотрудников. Вы можете создать поверхность факта зарплаты,Он содержит данные по каждой команде. Очевидная проблема здесь,Как предоставить авторизованным пользователям доступ на уровне сотрудников к данным о зарплате. Вы можете сделать это с другими Наборами данных.
Power BI меньшеиспользоватьиз功能之一даперекрестная газетаповерхность Сверлить。этот可Нетда Можно легковыполнитьиз功能,Потому что ее существование во многом зависит от того, как модель опубликована в сервисе Power BI. Мы не будем здесь вдаваться в подробности.,Но да хочет немного проиллюстрировать его функцию.,Когда вы включаете поверхность перекрестного отчета и поверхность отчета находится в одной рабочей области,Операции сверления можно включить в существующем отчете о поверхности.,Эти операции не позволяют перейти на другую страницу того же отчета.,Вы также можете перейти на страницу другой газеты.
Чтобы детализация между отчетами работала, просто убедитесь, что поля в обоих отчетах, используемые для операции детализации, имеют одинаковые имена, чтобы Power BI Может Воля它们识别для同один字段。иметь趣изда,Эти поверхности отчетов не обязательно должны иметь одну и ту же базовую модель. Это означает, что вы можете создать поверхность отчета, содержащую затраты на заработную плату по командам.,И просмотрите подробный отчет, показывающий расходы на заработную плату по сотрудникам конкретной команды. Подробный отчет об базовой модели можно использовать для создания собственной стратегии.,Таким образом, неавторизованные пользователи могут быть лишены возможности просмотра подробных данных.
Составная модель да смешанная DirectQuery Факты поверхности импортные факты стол Power BI Модель.Импортированная поверхность может быть даDirectQuery столагрегатная версия。этот功能旨существоватьспособен сообщитьи Анализируйте миллиарды ХОРОШОданные,и основано на (разумных) предположениях,То есть пользователям редко приходится видеть более низкие уровни детализации своих данных. Согласно заданному вопросу,Выбор модели Воля извлекает результаты из совокупной поверхности.,или ВОЗсуществоватьнуждатьсячасот DirectQuery поверхностьсередина检索结果。根据请求из聚合уровень自动Входить ХОРОШОвыбирать。для了确保聚合уровень,Это не то, чего мы хотим;,Мы хотим сделать выбор ХОРОШО на основе правил Безопасности.
Счастливчик да,Это да можно сделать. У вас может быть фактическая поверхность,Например, fSalaryTeam,включая расходы на заработную плату на уровне команды,Другая поверхность данных содержит затраты на заработную плату на уровне сотрудников.,fSalaryEmployee。использовать RLS,Вы можете защитить fSalaryEmployee от несанкционированного доступа пользователей,Вы даже можете разрешить пользователям доступ только к части данных fSalaryEmployee.,Напримери他们自己из团队相关из部分данные。
существуют в остальной части этого раздела,нас Воляиспользоватьодин Безопасность Роль,Этот персонаж имеет доступ к европейскому сектору на поверхности Teams.,а такжеfSalaryEmployeeповерхностьсерединаизEurope 2Команда(Номер команды = 9), в качестве простого примера, показанного на рисунке 5.26.
Рисунок 5.26 fSalaryTeam、fSalaryEmployee、Team и Employee поверхность
Фильтры безопасности включают следующий код.
[Division] = "Europe" // in table Teams
RELATED(Employee[TeamNr]) = 9 // in table fSalaryEmployee
Если вам нужно загрузить, обратитесь к файлу «2.1 Aggregation security1.pbix» во вспомогательных ресурсах на странице книги асинхронного сообщества. |
---|
Это внутривызов,Вам необходимо изменить DAX-код меры, а не самому настроить безопасность;,И да плавно переключается с одной фактической поверхности на другую. В идеале,Вам нужна мера,существовать团队уровеньили更高уровень Добиться прогресса ХОРОШО计算час,Получите расходы на зарплату от fSalaryTeam,Но на уровне детализации существования рассчитайте существованиеfSalaryEmployeeповерхность в ХОРОШО.
Эта проблема сводится к тому, в каком именно контексте оценивается метрика. существовать Глава 4 Контекст и фильтрация, вы видели несколько полезных для этого DAX функция(ISFILTERED、ISCROSSFILTEREDждать)。использоватьэтот些функция,Можно построить меру переключения между различными существующими фактами. Однако,На самом деле сделать это непросто,И происходят неожиданные вещи. Ваша первая попытка может быть следующей.
Salary Costs =
IF(
HASONEVALUE(Employee[EmpNr]),
SUM(fSalaryEmployee[Salary]),
SUM(fSalaryTeam[Salary])
)
Это выглядит нормально: всякий раз, когда выбирается номер сотрудника,в любом случае,Рассчитать зарплату от fSalaryEmployeeповерхность,или ВОЗотfSalaryTeamповерхностьсередина计算。HASONEVALUEфункция通常被那些没иметь太多经验из DAX Developeruse, в основном используется для следующих конструкций.
IF(HASONEVALUE(Table[Number]),
VALUES(Table[Number]) * 5
)
У нас наверняка есть лучшие способы извлечения отдельных значений из столбцов,Но кроме этого,HASONEVALUE (и аналогично,HASONEFILTER)функция还есть один个经常被忽视изсвойство:когдасуществовать列серединаТольковыбиратьодинценитьчас,они возвращаютсяистинный。когда该число大于 1 час,они возвращаютсяЛОЖЬ,но когда это 0,Они также возвращают false!
На рис. 5.27 показаны выходные данные показателя затрат на заработную плату для нашего примера роли безопасности.
Рисунок 5.27. Выходные затраты на заработную плату
Обратите внимание, сколько сотрудников имеют одинаковые затраты на заработную плату, и на самом деле они равны затратам на заработную плату команды. Также обратите внимание, что, как и Кай Такие сотрудники, как Белл, похоже, принадлежат к двум командам! Фактически, мы видим, что все сотрудники, которые не являются частью команды, отображаются в результатах всей команды. Причина существования в этих случаях: HASONEVALUE возвращает 0, что приводит к выбору значения метрики для расчета ХОРОШО. Подробное обсуждение причин оценки этих сотрудников см. в главе 8. Автоматическое сопоставление.
сейчассуществовать,Вы можете попробовать существующую формулу DAX inuseISFILTERED вместо daHASONEVALUE. Но да,Отчетность о расходах на заработную плату по уровням заработной платы и т. д. не помогает. Лучший конечно выбранный контент да нет подгруппы команды,существуют В этом случае,Пожалуйста, переключитесь на данные на уровне сотрудников.
Один из способов – просто посчитать количество сотрудников.,И сравните это число с общим количеством сотрудников в команде.,Код следующий.
Salary Costs =
IF(
COUNTROWS(Employee) =
CALCULATE(
COUNTROWS(Employee),
ALL(Employee),
VALUES(Team[TeamNr])
),
SUM(fSalaryTeam[Salary]),
SUM(fSalaryEmployee[Salary])
)
На рисунке 5.28 показан пример вывода для этой меры, включая имя и пол сотрудника (оба значения являются столбцами в даEmployeeповерхность).
Рисунок 5.28 Europe 2израсходы на заработную плату,по имени сотрудникаигендерная разбивка
Роли безопасности показывают только Европу 2 Уровень персонала Европейского отдела ирасходы на заработную плата. Как видно из результатов, затраты на заработную плату возвращаются для всех команд в Европе. Это явно поверхность, эти результаты взяты с поверхности fSalaryTeam. Затраты на заработную плату отдельных сотрудников возвращаются только в Европу. 2;верно于其他团队,Меры корректно извлекают данные из fSalaryEmployeeповерхность,но ничего не получит,Потому что фильтр безопасности делает свою работу. существуют при отчетности о компенсационных расходах по полу,Мы не рассматриваем сотрудников как личности. но,Эта метрика идентифицирует запросы на уровне агрегации ниже уровня команды.,И получить результат от fSalaryEmployeeповерхность.
Можетиспользовать RLS Воля защищает уровень агрегации и одновременно защищает частные данные, но при этом следует учитывать некоторые дополнительные моменты. Расширенная модель Воля, такая как Рисунок Как показано в 5.29.
Рисунок 5.29 использовать Employee(private)поверхность Входить ХОРОШОРасширять
еслихотеть Воля输出Изменятьдля按团队и薪资уровень划分израсходы на заработную плату(Salary Затраты), вы увидите, что для каждого уровня зарплаты вы получаете расходы для каждой команды. на заработную плату。когда然,Причина, по которой мы Конечно, полная команда существует, не существует метода, в контексте которого сейчас существуетиспользовать другую поверхность и стать неудовлетворительной. В формулу следует добавить дополнительное предложение ALL.,Код следующий.
Salary Costs =
IF(
COUNTROWS(Employee) =
CALCULATE(
COUNTROWS(Employee),
ALL(Employee),
ALL('Employee (private)'),
VALUES(Team[TeamNr])
),
SUM(fSalaryTeam[Salary]),
SUM(fSalaryEmployee[Salary])
)
Таким образом, мера вернет правильный результат, как показано на рисунке 5.30.
Рисунок 5.30 расходы по команде и уровень заработной платы на заработную плату
Всегда помните, что половина частной поверхности должна быть скрыта, чтобы избежать дублирования вывода (для Рисунок В версии 5.30 применен фильтр Безопасности [Частный]. =1). Конечно, теперь вы можете реализовать более сложные правила. Например, если вы хотите защитить более высокий уровень заработной платы, вы можете существовать Сотрудник (частный) выше, использовать ниже Фильтр. безопасности.
([Paylevel] <= 33 && [Private] = 1)
||
([Paylevel] > 33 && [Private] = 0)
В сочетании с фильтрами отделов и команд, рассмотренными выше, результаты показаны на рисунке 5.31.
Рисунок 5.31 расходы по команде и уровень заработной платы на заработную плату,Защитите более высокий уровень заработной платы
пожалуйста, обрати внимание,Для уровней оплаты выше 33 уровня,Мы не только не видим результатов,И цифры тоже не складываются. Но подожди,Разве существование не должно получить пустое ХОРОШО в результатах выше 34 уровня? Если присмотреться к фильтру «Безопасность»,Вы заметите, что отрицательное предложение ничего не делает с ХОРОШО. В Сотруднике(частном) и выше и Частном= нет уровня заработной платы 34. Строка: В конце концов, викор Частное= 0поверхность означает, что в ХОРОШО уже есть иллюстрировать, а остальные столбцы пусты! Это значит, что мы скрываем не только половину ХОРОШО.,И да скрывает больше ХОРОШО.
если вам нравится его результат,Конечно, это не проблема. в противном случае,Необходимо знать, у каких сотрудников уровень заработной платы выше.,И проверка ХОРОШО по количеству сотрудников. При выполнении данной операции (мы используем отложенный перебор некоторых номеров сотрудников),Воля отображает эти пустые значения.
Рисунок 5.32 Расходы на заработную плату по командам и уровням заработной платы,Защитите более высокий уровень заработной платы,и кажется пустым
Как видите, непросто заставить все работать так, как вы хотите. Мы не только существуем Европа 2 команды видят пробелы, другие команды тоже показывают пробелы. В конце концов, у нас есть доступ к этим командам. Все сотрудники в этих командах сгруппированы по существующим пустым уровням заработной платы и, следовательно, расходов. на заработную Логика метрики вознаграждения подсказывает, что мы смотрим на всех сотрудников команды и возвращаем расходы команды. на заработную плату。
Вы даже можете контролировать это, настроив фильтр безопасности для сотрудника (частный), чтобы пустой вывод был только для команд. Europe 2显Показывать。нас Воляэтот个问题留待你自己Приходить探究解决。
выше,Мы обсудили уровень агрегирования на основе каждого факта. выбрать Уровень агрегации безопасности Другой способ, которым уровень агрегации да Воля рассматривается как атрибут. так,所иметь连接из事实поверхностьа также因этотиз所иметь度量ценить都к Безопасность Стратегияиз约束。этот种方法Нетнравитьсянаспредыдущий Гибкий подход,Но преимущество в том, что вам не нужно писать специальное измерение DAX и его проще настроить.
В этом разделе представлены примеры загрузки файлов. Если вам нужно загрузить, обратитесь к файлу «2.1 Aggregation security2.pbix» во вспомогательных ресурсах на странице книги асинхронного сообщества. |
---|
Эта внутри основная идея да,Когда мы хотим обеспечить производительность на уровне отдельных сотрудников,Мы можем рассматривать каждый атрибут сотрудника как частный атрибут. другими словами,Публичный файл «Сотрудникповерхность Воля» содержит только первичный ключ (существовать столбец EmpNrиTeamNr в нашем примере).,Все остальные колонки Воля перемещены в Сотрудник(частный)поверхность,Как показано на рисунке 5.33. По методу уровня безопасности в этой главе.,Данные сотрудников могут быть эффективно защищены.
Рисунок 5.33 только держи Employee поверхностьсерединаиз主键
Предположим, вы хотите выполнить такое требование безопасности: Только может просматривать данные европейского отдела. Только Европа; Команда 2 может видеть это на уровне сотрудников. Это можно сделать через Teamи Employee В комплекте два фильтра Безопасности на (частную)поверхность. существовать Team поверхность по настройке с помощью следующих фильтров.
[Division] = "Europe"
На существованиеEmployee(private)поверхность (здесь мы используем тот факт, что значение в столбце Team Europe 2существоватьEmployeeстолTeamNr равно 9) происходит следующим образом.
(RELATED(Employee[TeamNr]) = 9 && [Private] = 1)
||
(RELATED(Employee[TeamNr]) <> 9 && [Private] = 0)
Используя простой показатель продаж, вы можете получить результат, показанный на рисунке 5.34.
Рисунок 5.34 использовать VLS Результат политики безопасности
Аналогично, вы можете разделить Employee (private)поверхностьи创建Employee(very private)поверхность Приходить Защищать员工из某些свойство(хотяв это времянас建议использовать Нет同из命名方案)。этоти之前讨论过из Нет同私иметьсвойство集из解决方案из原理完全相同。
И поверхность, и исходная поверхность «Сотрудник» устанавливают связь, как показано на рисунке 5.35.
Рисунок 5.35 Добавить Сотрудник(очень private)поверхность
Теперь существуют, можно относиться к Сотруднику(очень частная) поверхность Применяйте различные фильтры безопасности, например, используйте структуру прямого/антифильтра, чтобы разрешить доступ только сотрудникам. 10220 Очень конфиденциальные данные, код следующий.
([EmpNr] = 10220 && [Private] = 1)
||
([EmpNr] <> 10220 && [Private] = 0)
Результат визуализации поверхности показан на рисунке 5.36.
Рисунок 5.36. Доступ к личным данным сотрудников
Этот метод защиты уровня агрегации не 100% Безопасность из-за того, что поверхность по-прежнему использует степень детализации на уровне сотрудников. Пользователи самообслуживания могут записывать значения показателей следующим образом, чтобы получить результаты конкретных сотрудников.
Sales 10201 =CALCULATE([Sales],fSales[EmpNr] = 10201)
но,хочу сделать это,Пользователи должны знать число 10201 и что оно означает. если вы хотите восстановить этот метод,По крайней мере, это не должны быть бизнес-ключевые слова, хорошо известные в организации (например, количество сотрудников).
Я полагаю, что, прочитав эту главу, вы поняли, как защитить Power BI Модель.Безопасность на уровне Функция строки очень полезна, главным образом потому, что вы можете использовать DAX выполнить复杂из Фильтр безопасности.
существовать Power BI 模型серединавыполнитьбезопасностьчас,Нужно быть осторожнымдизайн,Это главным образом связано с тем, что модель может иметь несколько символов безопасности.,И пользователь может быть участником нескольких ролей. Не все персонажи Безопасности можно эффективно объединить в одной модели.,Поэтому безопасность может даже повлиять на решение разделить модель.
использовать DAX позволяет вам получить идентификационные данные пользователя и использовать их для определения того, какие данные видны, таким образом выбирая высоко персонализированные настройки безопасности. Вы даже можете использовать DAX внутри PATHфункция перемещается по иерархии организации.
Вы также узнали, что благодаря моделированию DAX и Безопасность на уровне Допустимая комбинация строк, вы можете выбрать другие формы безопасности, например для Защитные. Уровень значения свойствабезопасности, а также уровень агрегации защиты.
Общий вывод да: DAX мощный не только как язык анализа данных, но и с точки зрения стратегии.
существовать下一章середина,Наша Воля в фокусе президента совсем другая тема: визуализация.,И как сделать эти визуализации лучше, чем Power Визуальные объекты самой BI, более динамичны.