Row Level Security

Row level security, ya da kısa yazılışıyla RLS, veri modeline erişen kullanıcının kimliğine göre modeli  filtrelememizi  sağlayan bir özellik.

Diyelim bir satış modelimiz var ve gayet güzel raporlar hazırladık. Sonraki ihtiyaç genelde şöyle bir şeye benziyor: Marmara bölge müdürü girdiğinde sadece Marmara bölgesine ait satışları, Ege bölge müdürü girdiğinde sadece Ege bölgesine ait satışları görsün, ama genel müdür girerse hepsini görsün!

Row level security'nin  iki bacağı var : İlk olarak Power BI Desktop 'ta roller yaratmak gerekiyor, Ege Bölgesi, Marmara Bölgesi gibi. Bu rolleri yarattıktan sonra modeli buluta bastığımızda,  bulut tarafında  ilgili dataset'in Security ayarlarından da bu rollere kullanıcıları atamak gerekiyor.

Örnek modelde, ürün kategorilerine göre satışları gösteren bir rapor sayfamız var:


Bu rapor setini buluta bastığımızda, giren kullanıcı "X" ise sadece "Ev Aletleri" 'ni "Y" ise "Kameralar" 'ın satışlarını görsün istiyoruz diyelim.

Power BI Desktop'ta bunun için iki tane rol yaratmamız lazım öncelikle.

"Modelling" tabındayken "Manage Roles" u seçiyorum.


Çıkan menü rolleri tasarlayacağımız menü: "Tables" bölümü model içerisindeki tüm tabloları ve tüm sütunları içeriyor. Hangi sütun -veya sütunlar- üzerinden rol tasarlayacaksak, ilgili tablonun yanındaki üç noktadan "Add Filter" deyip ilgili sütunu seçiyorum.

"Table Filter DAX expression" kısmına, sonucu True ya da False dönecek bir formül yazmamız lazım: [Kategori] = "Ev Aletleri" gibi.

Yarattığım role bir isim verip kaydediyorum. Aynı işlemi Kategori sütunu Kameralar olacak şekilde tekrarlayarak bir rol daha yaratıyorum.


Yarattığımız rollerin etkisini desktop'tayken görebiliriz. "Modelling" tabındayken "View Roles" seçiyorum.


Rollerden "Ev Aletleri" 'ni seçiyorum. Biraz önce tüm kategorileri gösteren görsel, bu sefer sadece Ev Aletleri kategorisini gösteriyor.

** Eğer filtre olarak aynı sütun üzerinden birden fazla koşul vermek isterseniz yazacağınız filtre formülünü, sonucu TRUE/FALSE olacak şekilde yazmanız gerekir. Örneğin ev aletleri + kameralar üzerinden bir rol yaratacaksanız aşağıdaki gibi yazabilirsiniz.

[Kategori] = "Ev Aletleri" || [Kategori] = "Kameralar"

Modeli bu haliyle  buluta bastığımızda  oluşturduğumuz roller ilgili dataset'in altındaki "Security" menüsünde gözükecek. Datasetin hemen yanındaki üç noktadan "Security" 'yi seçiyorum.


Çıkan menüde oluşturduğumuz roller var ve her bir rolü kimlerin görmesini istiyorsak kullanıcıların email adreslerini bu rollere tek tek ekliyoruz.



"Members" bölümüne tekil kullanıcıları veya kullanıcı gruplarını ekleyebiliriz.  Rollere atanan kullanıcılar bulut servisine girdiğinde artık sadece ilgili rolün filtresine göre görecek raporları. Model aynı model, raporlar aynı raporlar fakat kullanıcının kim olduğuna göre veriyi filtreleyebiliyoruz bu sayede.

Burada hatırlamamız gereken bir nokta var, çalışma alanını (workspaces) yaratırken kullanıcıların raporu  sadece görüntülemesine  izin vermek gerekiyor. Full erişim hakkı olması durumunda RLS çalışmıyor.


RLS, satır seviyesinde bir filtreleme, örnekte olduğu gibi sadece Ev Aletleri'ni görsün diyebiliriz.  Ama sadece satışlarını görsün, maliyetlerini görmesin diyemiyoruz. Ya da -varsa modelimizde- birim maliyet sütununu görmesin diyemiyoruz. Ya da şu tabloyu görmesin de diyemiyoruz.

Obje seviyesinde filtreleme -ya da yetkilendirme- henüz Power BI 'da yok. Kullanıcı talepleri listesinde adı geçiyor ama ne zaman başlanır, gelir mi gelmez mi belli değil. Fakat bu özellik SQL Analysis Service 'in on-prem ve Azure versiyonlarında var.

Bu tür bir durumda yapılabilecek iki şey var; ilki, satışı görsün ama maliyeti görmesin istiyorsak -haliyle- maliyetle ilgili sütunları/metrikleri modele hiç koymamak. Ya da metrikleri yazarken USERNAME veya USERPRINCIPAL fonksiyonlarından faydalanmak. USERNAME () fonksiyonu -desktop'ta- kullanıcı ismini DomainAdı\KullanıcıAdı formatında döndürüyor, diğeri ise kullanıcıadı@domainadı.com.tr şeklinde. Bulutta her iki fonksiyon da kullanıcıadı@domain.com.tr şeklinde döndürüyor.

Kullanıcı := USERPRINCIPALNAME()
Kullanıcı_USERNAME := USERNAME()

Power BI Desktop'ta gözüken:

Bulutta gözüken:

Maliyetleri hiç görmesin deme şansımız şu an yok ama maliyet değerini manipule edebiliriz!

Maliyet = 
IF( [Kullanıcı] = "hgungormus@intellectbi.com" ; 
    BLANK() ;
    SUMX('Satışlar' ; 'Satışlar'[Miktar] * 'Satışlar'[Birim Maliyet] )
)

Sistemde yüzlerce kullanıcı varsa ne yapacağız sorusunun ucu biraz açık, daha doğrusu duruma bağlı.  Kullanıcı bilgilerini farklı şekillerde modele gömüp çözüm üretmek mümkün.

Daha önce Power BI öğrenmek için öneriler 'de bulunmuştum, oradaki linklere kasperonbi.com 'ı da eklemek lazım mutlaka, kendisi Power BI 'ı geliştiren ekip içerisinde ve çok sağlam bilgiler paylaşıyor, takip edilmesi gereken sitelerden biri kesinlikle. Konuyla ilgili bir yazısının linkini eklemekte fayda var.

Yazıdaki modeli indirebilirsiniz.

Sadece kayıtlı üyeler görebilir. Giriş veya Üyelik için login.