SSAS/Power BI 行级安全性

问题描述 投票:0回答:1

我一直在使用 radacad 创建的一些非常有用的文章(例如 https://radacad.com/dynamic-row-level-security-with-manager-level-access-in-power-bi),使我能够向我的 SSAS 数据模型添加一些行级安全性,该模型是 Power BI 仪表板的数据源。

本质上,这就是我希望行级安全性发挥作用的方式。

  1. 如果登录用户是经理且其部门为 LOD1,则他们可以看到整个组织的数据。
  2. 如果登录的用户是经理,他们会看到自己的数据以及与自己同一部门的数据。
  3. 如果登录用户不是管理员,他们只能看到自己的数据。

上面代表下面的每个If语句。

以下 DAX 几乎足够完美:

=
If(
MaxX(
Filter(
'Employee',
'Employee'[Email]=USERPRINCIPALNAME() )
,'Employee'[IsManager])="Yes" 
&&
MaxX(
Filter(
'Employee',
'Employee'[Email]=USERPRINCIPALNAME() )
,'Employee'[Department])="LOD1" 
,1=1
,
If(
MaxX(
Filter(
Employee,
[Email]=USERPRINCIPALNAME())
, Employee[IsManager])="Yes" 
&& 
MaxX(
Filter(
Employee,
[Email]=USERPRINCIPALNAME())
, Employee[Department]) <> "LOD1",
PATHCONTAINS(Employee[Department],
MaxX(
Filter(
Employee,
[Email]=USERPRINCIPALNAME())
, Employee[Department]
)),
[Email]=USERPRINCIPALNAME()))

但是,我在使用 MaxX 表达式时遇到了问题。这是因为在 Employee 表中,一名员工可以拥有多个行,因为一名员工可以拥有多个部门。因此,对于拥有多个部门的员工,Power BI 仪表板仅向他们显示所选最大部门的数据。

如果有人可以帮助我调整我的查询以适应这一障碍,并允许拥有多个部门的员工查看他们的所有部门,而不仅仅是最大部门,那就太好了。

谢谢

powerbi ssas row-level-security
1个回答
0
投票

您可以使用

DISTINCT
VALUES
获取用户的部门列表,然后在过滤条件中执行
IN

尝试:

var isManagerLOD1 = 
  COUNTROWS(
    FILTER(Employee,
    'Employee'[Email]=USERPRINCIPALNAME() &&
    'Employee'[IsManager] = "Yes" &&
    'Employee'[Department] = "LOD1" 
    )
  ) > 0

var managerDepartments = CALCULATETABLE(
  DISTINCT('Employee'[Department]),
  FILTER(Employee,
    'Employee'[Email] = USERPRINCIPALNAME() &&
    'Employee'[IsManager] = "Yes"
  )
)

var isManagerDepartment = 
  COUNTROWS(
    FILTER(Employee,
    'Employee'[Department] IN managerDepartments 
    )
  ) > 0

var isUser = [Email]=USERPRINCIPALNAME()

return isManagerLOD1 || isManagerDepartment  || isUser
© www.soinside.com 2019 - 2024. All rights reserved.