Power BI: Row Level Security phân quyền động theo dữ liệu

Trong bài viết trước, chúng ta đã đề cập cách thức phân quyền dữ liệu theo vai trò và gán người dùng vào từng vai trò. Bài viết dưới đây sẽ mô tả cách thức thực hiện phân quyền động, linh hoạt hơn dựa trên giá trị của từng bản ghi dữ liệu. Giả thiết rằng bài toán yêu cầu dữ liệu bán hàng của cá nhân nào chỉ được xem bởi cá nhân đó, chỉ quản lý mới có thể xem dữ liệu của toàn bộ nhân viên bán hàng dưới quyền. Chúng ta thiết lập như sau:

Bảng dữ liệu SalePerson chứa thông tin nhân viên kinh doanh

Bảng dữ liệu SaleTransaction chứa số liệu bán hàng như sau

Hai bảng này liên kết với nhau thông qua ID của SalePerson

Thiết lập Report với 2 mẫu Visual như sau

Tại FIELDS SaleTransaction thực hiện thêm mới 1 New measure để hiển thị tên người đăng nhập giá trị như sau:

User = USERNAME();

Thêm mới 1 New measure để hiển thị thời gian xem report.

Now = NOW();

Thêm 2 giá trị này vào Report để hiển thị như sau

Thực hiện tạo mới Sales role với bộ lọc [UserName] = USERNAME() để lọc ra dữ liệu dựa theo tài khoản người dùng đăng nhập như sau:

Chúng ta tiến hành Publish báo cáo này lên Power BI Service và cấu hình tài khoản tương ứng như bài trước ta có kết quả xem với tài khoản Bill Gates như sau

Như vậy chúng ta có thể lọc dữ liệu hiển thị dựa trên tài khoản đăng nhập của từng người dùng. Hay nói cách khác dữ liệu của người nào chỉ có thể xem được của người đó. Trong trường hợp vai trò quản lý có thể xem toàn bộ dữ liệu bán hàng của nhân viên dưới quyền, chúng ta chỉ việc thêm mới 1 vài trò và gán người dùng tương ứng vào vai trò.

Giả thiết rằng người dùng Quang là quản lý của Bill và Jeff, có nhu cầu xem toàn bộ dữ liệu sale của cả 3 chúng ta thiết lập như sau

  • Tạo mới 1 role với tên là Manager trong DAX expression để trống
  • Publish report này lên Power BI Service
  • Thêm Quang vào vai trò Manager rồi kiểm tra hiển thị ta được như sau

Dữ liệu đã hiển thị đầy đủ cho toàn bộ sale person với vai trò Manager

Tuy nhiên với cách này thì chúng ta đang gán chặt từng người vào vai trò Manager trên Power BI Service. Chúng ta có thể tổ chức dữ liệu theo cách dưới đây để Power BI tự động phân loại vai trò Manager theo dữ liệu phía dưới như sau:

Giả thiết bảng SalePerson có cột IsManager để xác định ai là quản lý như sau. Trong trường hợp này ta thiết lập Quang là quản lý của Bill và Jeff trong dữ liệu

Cập nhật role Sales với DAX expression như sau:

If(MaxX(Filter(SalePerson,[UserName] = USERNAME()),[IsManager])=0,[UserName]=USERNAME(),1=1)

  • Filter(SalePerson,[UserName] = USERNAME()): Lấy ra tất cả các bản ghi dữ liệu của người đang đăng nhập
  • MaxX(Filter(SalePerson,[UserName] = USERNAME()),[IsManager]): Xác định xem trong các bản ghi lấy ra ở trên người dùng đang đăng nhập đó có giá trị IsManager là 1 hay không (có phải là Manager hay không)

Ở đây chú ý rằng không có định nghĩa role là Manager.

Thực hiện Publish báo cáo này lên Power BI Service và gán toàn bộ Quang, Bill và Jeff vào vai trò Sales rồi kiểm tra dữ liệu ta được kết quả tương tự như bước định nghĩa Role Manager ở trên

This Post Has 2 Comments

  1. Bắc

    Hay quá, cảm ơn anh đã chia sẻ

Leave a Reply