Power BI支持行級安全(Row-Level Security,RLS)的權限控制,用於限制用戶對Dashboard、報表和DataSet的訪問。用戶瀏覽的報表是相同的,可是看到的數據倒是不一樣的。express
RLS內部經過DAX函數 username() 和 userprincipalname()來實現,RLS使得PowerBI可以在行級別上對用戶訪問的數據進行限制。這兩個函數在PowerBI Desktop中返回的都是用戶的信息,只不過格式不一樣:安全
這兩個函數在PowerBI Service中返回的格式是相同的:user_name@domain.com。若是須要發佈到PowerBI Service中,建議使用 userprincipalname()函數來建立過濾規則。dom
RLS的主要組件是:Users、Roles和Rules。用戶訪問數據時,RLS按照角色中定義的規則對用戶的訪問進行控制。函數
在PowerBI Desktop中建立角色和規則,當發佈到PowerBI Service中時,角色和規則也會發布到PowerBI Service中,報表開發人員須要在PowerBI Service中對DataSet的Security進行配置。spa
實現RLS的關鍵一步是配置用戶權限表,用戶權限表用於指定用戶有權限訪問的數據,而關係是RLS可以起做用的基礎,經過關係的交叉過濾功能實現用戶訪問數據的行級控制。excel
舉個例子,有以下用戶權限表:code
在本例中,咱們在規則中使用userprincipalname()函數,UserName列是用戶的郵件地址,Product列是用戶能夠訪問的產品類型,一個User能夠訪問多個Product。該表和DimProductCategory建立關係時,設置爲「many to 1」的雙向關係,經過UserName來過濾用戶能夠訪問的Product。blog
有了用戶權限配置表以後,接下來就是建立角色和規則,角色是用戶的集合,角色中的全部用戶遵照相同的規則;規則是定義用戶是否有訪問數據的權限。ip
在Modeling 選項卡中,選擇「Manager Roles」:ci
點擊「Create」按鈕,建立一個Role,並命名角色。從Tables列表中添加Filter,在「Table filter DAX expression」 中輸入DAX表達式,也就是建立規則,用於對用戶進行過濾:
爲了確保規則的正常運行,點擊「View as Roles」,查看規則運行的狀況:
也能夠選擇Other user,輸入一個用戶名稱,檢查規則對該用戶產生的效果。
在建立角色時,能夠建立一個admin的角色,能夠訪問全部的數據,設置DAX表達式:
UserName='admin@domain.com'
對於其餘用戶,其訪問數據的權限受到限制,建立常規的角色,設置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 BI)