我们已经开发了Power BI报表,并且需要将Power BI报表嵌入Angular应用程序中。 Angular应用程序使用OAuth身份验证。我们已经了解了如何嵌入Power BI报告(如链接中所述-为客户嵌入-https://docs.microsoft.com/en-us/power-bi/developer/embedding#embedding-for-your-customers)
我们还需要在Power BI报告中进行精细的授权。是否可以根据登录Angular UI应用程序的用户过滤数据?
答案 0 :(得分:1)
是的,我曾经使用过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);
})
答案 1 :(得分:0)
您可以通过两种方式实现此目的-嵌入报表时定义filters或使用Row-Level Security。
嵌入Power BI元素时,您正在初始化configuration。该对象的属性之一是在加载时预先应用于报表的过滤器。当前,这些是受支持的过滤器类型:
export enum FilterType {
Advanced = 0,
Basic = 1,
Unknown = 2,
IncludeExclude = 3,
RelativeDate = 4,
TopN = 5,
Tuple = 6
}
这些类型与过滤器相对应,当在浏览器或Power BI Desktop中显示时,可以在报表中应用这些过滤器。有关每种过滤器类型具有哪些属性以及如何使用的更多信息,请参见文档中的Filters页,但是例如,一个基本过滤器需要定义要在其上应用过滤器的表和列,比较运算符,当然还有值,例如:
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和希望用户在请求正文中拥有的pass the roles:
{
"accessLevel": "View",
"identities": [
{
"username": "john@contoso.com",
"roles": [
"sales",
"marketing"
],
"datasets": [
"cfafbeb1-8037-4d0c-896e-a46fb27ff229"
]
}
]
}
然后使用上面获取的令牌嵌入报告,并且如果需要,不要忘记将配置中的tokenType
属性的值更改为1(嵌入)而不是0(AAD)。
通过这种方式,您可以使“过滤器”窗格保持可见状态,因为安全策略将由引擎在后台应用。