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!

Bu durumun Power BI 'daki karşılığı row level security !

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:

row level security

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.

rls 2
rls 3

Çı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.

rls 4

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

rls 5

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

rls 6

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

rls 7

** 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.

rls 8

Çı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.

rls 9
rls 10

"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 11

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()
rls 13
rls 14

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] )
)
rls 15

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.

Bloga sosyal medya hesabınızla hızlı üyelik-giriş için ilgili ikonu tıklayabilirsiniz.

“Row Level Security” üzerine 9 yorum

  1. Merhaba hocam,

    Benim raporumda da aynı şekilde kullanıcılar var. Ben hangi kullanıcı girerse onun ismiyle filtrelensin istiyorum fakat bir sürü kullanıcı var. Bunların hepsini tek tek Cloud üstünde atamasını yapmak zor olmaz mı? Buna yönelik bir çözüm var mıdır?

    Teşekkürler.

  2. Standart metod malesef öyle, tek tek kullanıcıları eklemek gerekiyor. Fakat bahsettiğiniz durum için sanki modelleme tarafında çözülebilir. Kullanıcı isimlerini (emaillerini) içeren bir tablo yaratıp metrikleri buna göre yazmak çözüm olabilir, denemek lazım. Eğer denerseniz yazıdaki fonksiyonları ve belki SWITCH i kullanmak gerekir sanırım.

  3. Merhaba hocam,

    Benim raporumda da aynı şekilde kullanıcılar var. Ben hangi kullanıcı girerse onun ismiyle filtrelensin istiyorum fakat bir sürü kullanıcı var. Bunların hepsini tek tek Cloud üstünde atamasını yapmak zor olmaz mı? Buna yönelik bir çözüm var mıdır?

    Teşekkürler.

  4. Merhaba

    Elimde bir grup kullanıcım var. Tamamı ERP toolu içerisinde farklı yetkilere sahip ve bu yetkilerde kimin hangi yetkiyle donatıldığı bir SQL sorgusunda tutuluyor(Ya da benzer bir şekilde). Bu sorguyu real time olarak power bi da da kullanmak istiyorum.

    Dolayısıyla sadece ERP de görebildiği bilgilerin grafiklerini PBI üzerinde aynı kullanıcı ile sadece grafik ya da benim belirlediğim şekilde görecek. Çalışanlar arasında bir sirkülasyon olduğunda da güncellenen SQL sorgusu nedeniyle bende manuel olarak o kişinin yetkilerini değiştirmeye uğraşmayacağım.

    Benzerine hiç rastlamadım PBI üzerinde. Gerçekleştirebilmek olası mı ? Ne bileyim belki bir API arada bu işi görebilir vs… Bunu onu merak ediyorum.

    İyi Çalışmalar

    • stored procedure ile bunu yapabiliyorsanız SQL tarafında bunu veri kaynağı olarak kullanabilirsiniz, yapılabilir mi sp ile emin değilim. PBI'ın gördüğü kullanıcılar ile -dolayısıyla RLS ayarları ile- SQL'in eşleşeceğini zannetmiyorum.

      • Peki DAX ile bu koşul yapılarını oluşturmamız mümkün müdür ? DAX ile sadece hesaplamaların yapılabildiğini biliyoum. Yetkilendirmeleri parametrelere sql sorgusu içerisinden bağlayarak bu sorun çözülebilir gibi geliyor bana. Lakin bunun için DAX ile if else koşullarını yazmak gerekiyor bu mümkün müdür ?

Yorum yapın