PowerBI開發 第十五篇:Power BI的行級安全
Power BI支援行級安全(Row-Level Security,RLS)的許可權控制,用於限制使用者對Dashboard、報表和DataSet的訪問。使用者瀏覽的報表是相同的,但是看到的資料卻是不同的。
RLS內部通過DAX函式 username() 和 userprincipalname()來實現,RLS使得PowerBI能夠在行級別上對使用者訪問的資料進行限制。這兩個函式在PowerBI Desktop中返回的都是使用者的資訊,只不過格式不同:
- username() :返回 domain\user_name
- userprincipalname() :返回 [email protected]
這兩個函式在PowerBI Service中返回的格式是相同的:[email protected]。如果需要釋出到PowerBI Service中,建議使用 userprincipalname()函式來建立過濾規則。
一,實現RLS的元件
RLS的主要元件是:Users、Roles和Rules。使用者訪問資料時,RLS按照角色中定義的規則對使用者的訪問進行控制。
- Users:瀏覽報表的使用者,使用user name 或 email address 來唯一標識。
- Roles:使用者屬於Role,一個角色是一個Rule的容器。
- Rules:規則(Rule)是過濾資料的斷言(Predicate)。
在PowerBI Desktop中建立角色和規則,當釋出到PowerBI Service中時,角色和規則也會發布到PowerBI Service中,報表開發人員需要在PowerBI Service中對DataSet的Security進行配置。
二,建立使用者許可權表和關係
實現RLS的關鍵一步是配置使用者許可權表,使用者許可權表用於指定使用者有許可權訪問的資料,而關係是RLS能夠起作用的基礎,通過關係的交叉過濾功能實現使用者訪問資料的行級控制。
舉個例子,有如下使用者許可權表:
在本例中,我們在規則中使用userprincipalname()函式,UserName列是使用者的郵件地址,Product列是使用者可以訪問的產品型別,一個User可以訪問多個Product。該表和DimProductCategory建立關係時,設定為“many to 1”的雙向關係,通過UserName來過濾使用者可以訪問的Product。
三,建立角色和規則
有了使用者許可權配置表之後,接下來就是建立角色和規則,角色是使用者的集合,角色中的所有使用者遵守相同的規則;規則是定義使用者是否有訪問資料的許可權。
在Modeling 選項卡中,選擇“Manager Roles”:
點選“Create”按鈕,建立一個Role,並命名角色。從Tables列表中新增Filter,在“Table filter DAX expression” 中輸入DAX表示式,也就是建立規則,用於對使用者進行過濾:
為了確保規則的正常執行,點選“View as Roles”,檢視規則執行的情況:
也可以選擇Other user,輸入一個使用者名稱稱,檢查規則對該使用者產生的效果。
四,管理角色和規則
在建立角色時,可以建立一個admin的角色,可以訪問所有的資料,設定DAX表示式:
UserName='[email protected]'
對於其他使用者,其訪問資料的許可權受到限制,建立常規的角色,設定DAX表示式:
UserName = userprincipalname()
把PowerBI釋出到PowerBI Service中,需要在資料模型中管理RLS。在PowerBI Service的Datasets中,點選Security,把使用者新增到角色中:
把使用者或使用者組新增到角色中,使用者組中的使用者有許可權訪問報表。在訪問報表時,userprincipalname()函式返回的是使用者的郵件地址,而不是使用者組的郵件地址,從而實現使用者的許可權控制:
報表管理人員,可以建立一個使用者組,把使用者組新增到角色中,並通過使用者組來管理User對報表的訪問,以實現RLS。
參考文件:
Row-level security (RLS) with Power B
USERPRINCIPALNAME – show user name and use it in RLS (DAX – Power Pivot, Power