Внедрение Power BI в приложение Angular UI - PullRequest
2 голосов
/ 01 октября 2019

Мы разработали отчет Power BI, и у нас есть требование встроить отчет Power BI в угловое приложение. Angular Application работает с аутентификацией OAuth. Мы видели, как встраивать отчет Power BI (как упомянуто в ссылке - Встраивание для клиентов - https://docs.microsoft.com/en-us/power-bi/developer/embedding#embedding-for-your-customers)

) У нас также есть требование сделать детальную авторизацию в отчете Power BI. Возможно ли это? отфильтровать данные по пользователю, вошедшему в приложение Angular UI?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Да, возможно, я использовал Ngx-power-bi . Это может помочь вам

private powerBiService: NgxPowerBiService;
private pbiContainerElement: HTMLElement;

private reportId = "YOUR REPORT ID";
private groupId = "YOUR GROUP ID";
private filterPaneEnabled= false;
private navContentPaneEnabled= true;

constructor(private authService: AuthService,private dashboardService:DashboardService) {
this.powerBiService = new NgxPowerBiService();
}

ngOnInit() {

//Get the token from backend, You may use switchMap or flatMap 
//to get the user data (table, column, value etc)

this.dashboardService.getAccessToken().pipe(untilDestroyed(this)).subscribe(token=>{
    const config = {
        type: 'report',
        id: this.reportId,
        embedUrl:
          'https://app.powerbi.com/reportEmbed?' +
          'reportId='+this.reportId +
          '&groupId='+ this.groupId,
        accessToken:token.accessToken,
        settings: {
          filterPaneEnabled: this.filterPaneEnabled,
          navContentPaneEnabled: this.navContentPaneEnabled
        },
        filters:[{
            $schema: "http://powerbi.com/product/schema",
            filterType:1,
            target: {
              table: "Master", // filter table
              column: "companyId" // filter column
            },
            operator: "In",
            values: [101]   // value that you need to filter

          }]
      };
    this.pbiContainerElement = <HTMLElement>(document.getElementById('pbi-container'));
    this.powerBiService.embed(this.pbiContainerElement, config);
})
0 голосов
/ 01 октября 2019

Этого можно добиться двумя способами - определить фильтры при встраивании отчета или с помощью Безопасность на уровне строк .

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

export enum FilterType {
  Advanced = 0,
  Basic = 1,
  Unknown = 2,
  IncludeExclude = 3,
  RelativeDate = 4,
  TopN = 5,
  Tuple = 6
}

Эти типы соответствуют фильтрам, которые можно применять в отчете при отображении в браузере или в Power BI Desktop. Для получения дополнительной информации о том, какие свойства имеет каждый тип фильтра и как его использовать, см. Страницу Фильтры в документации, но, например, базовый фильтр должен определить таблицу и столбец, к которым будет применяться фильтр,оператор сравнения и, конечно, значения, например:

const basicFilter: pbi.models.IBasicFilter = {
  $schema: "http://powerbi.com/product/schema#basic",
  target: {
    table: "Store",
    column: "Count"
  },
  operator: "In",
  values: [1,2,3,4],
  filterType: 1 // pbi.models.FilterType.BasicFilter
}

или

const basicFilter = {
  $schema: "http://powerbi.com/product/schema#basic",
  target: {
    table: "Store",
    column: "Count"
  },
  operator: "In",
  values: [1,2,3,4],
  filterType: 1 // pbi.models.FilterType.BasicFilter
}

Затем установите этот фильтр в конфигурации до встраивания:

var config = {
    type: embedType,
    accessToken: accessToken,
    tokenType: tokenType,
    embedUrl: embedUrl,
    id: embedId,
    dashboardId: dashboardId,
    permissions: permissions,
    settings: {
        filterPaneEnabled: false,
        navContentPaneEnabled: true
    },
    filters: [basicFilter]
};

Примечание,что в этом случае вы должны скрыть панель фильтра, установив filterPaneEnabled: false, в противном случае пользователь увидит предварительно примененный фильтр на панели фильтров и сможет его изменить или удалить! Но если вы скроете панель фильтров, это ограничит возможности пользователей анализировать данные, используя только слайсеры и другие параметры, представленные в самом отчете. Таким образом, использование RLS может быть лучшей идеей, но для этого требуется выделенная емкость для вашего рабочего пространства (т. Е. Покупка Power BI Premium или Power BI Embedded).

Для использования RLS вы должны определить один илибольше ролей в вашем отчете. Для каждой роли будет определено выражение DAX для фильтрации данных. Затем для каждого из ваших пользователей вы можете решить, какую роль или роли назначить, и в отчете будут показаны только данные, доступные для этих ролей. Затем используйте полученный токен AAD для вызова GenerateTokenInGroup REST API и передачи ролей , которые вы хотите, чтобы ваш пользователь имел в теле запроса:

{
  "accessLevel": "View",
  "identities": [
    {
      "username": "john@contoso.com",
      "roles": [
        "sales",
        "marketing"
      ],
      "datasets": [
        "cfafbeb1-8037-4d0c-896e-a46fb27ff229"
      ]
    }
  ]
}

Затем используйте полученный токен для встраивания отчета и не забудьте изменить значение свойства tokenType в конфигурации на 1 (встраивать) вместо 0 (AAD), если это необходимо.

Таким образом, вы можете оставить панель фильтров видимой, потому что движок будет применять политики безопасности под капотом.

...