Row Level Security(RLS) bize, bir database altında bulunan tablodaki verilerin row bazlı erişim kontrolünü sağlar.
Örnek verecek olursak; Bir işletme düşünün bu işletmenin Sahibi(Boss), Satış Müdürü(Manager), Üretim Mühendisi(Engineer) ve Güvenlik Görevlisi(Bodyguard) olsun.
Bu işletmede araçlar için ürünlerin üretildiğini ve satıldığını düşünelim.
İşletme Sahibi Üretilen ve Satılan tüm ürünleri görebilsin.
Satış Müdürü sadece satılan tüm ürünleri görebilsin.
Üretim Mühendis sadece üretilen ürünleri görebilsin.
Ve son olarak Güvenlik Görevlisinin uygulamaya erişimi olsun fakat bu konu hakkında hiç bir bilgiye erişemesin.
Yukarıdaki senaryomuza göre adım adım bilgilerimizi tamamlayalım.
USE AdventureWorks2017 CREATE TABLE Product ( ProductID int identity(1,1), Authorized sysname, ProductCase varchar(20), Product varchar(20), Qty int );
USE AdventureWorks2017 INSERT INTO Product VALUES ('Boss','All', 'Car', 5); INSERT INTO Product VALUES ('Engineer','Production', 'Wheel', 1); INSERT INTO Product VALUES ('Engineer','Production','Jant', 4); INSERT INTO Product VALUES ('Manager','Sales', 'Koltuk', 2); INSERT INTO Product VALUES ('Manager','Sales', 'Paspas', 3); INSERT INTO Product VALUES ('Manager','Sales', 'Cam', 6);
USE AdventureWorks2017 SELECT * FROM Product;
Senaryomuzda okumasını istediğimiz ve istemediğimiz kişileri oluşturup ilgili tabloya okuma yetkilerini veriyoruz.
USE AdventureWorks2017 CREATE USER Boss WITHOUT LOGIN; GRANT SELECT ON dbo.Product TO Boss; CREATE USER Manager WITHOUT LOGIN; GRANT SELECT ON dbo.Product TO Manager; CREATE USER Engineer WITHOUT LOGIN; GRANT SELECT ON dbo.Product TO Engineer; CREATE USER Bodyguard WITHOUT LOGIN; GRANT SELECT ON dbo.Product TO Bodyguard;
Yeni bir table value function oluşturuyoruz. Bunu oluşturmadaki amacımız RLS yapacağımız verilerde hangi kolon altındaki değerlere göre bunu yapacağız.
USE AdventureWorks2017 CREATE FUNCTION dbo.tvf_fn_RLS(@Authorized AS sysname) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE @Authorized = USER_NAME() OR USER_NAME() = 'Boss';
Filtrelenecek kolona güvenlik policy ekliyoruz. Policy durumu kesinlikle ON olmalı yoksa RLS çalışmaz.
USE AdventureWorks2017 CREATE SECURITY POLICY SalesProdFilter ADD FILTER PREDICATE dbo.tvf_fn_RLS(Authorized) ON dbo.Product WITH (STATE = ON);
Tüm bu işlemlerden sonra tek tek oluşturduğumuz kullanıcılar için sorgu sonuçlarını aşağıda inceleyebilirsiniz.
USE AdventureWorks2017 EXECUTE AS USER = 'Boss'; SELECT * FROM Product; REVERT;
EXECUTE AS USER = 'Manager'; SELECT * FROM Product; REVERT;
EXECUTE AS USER = 'Engineer'; SELECT * FROM Product; REVERT;
EXECUTE AS USER = 'Bodyguard'; SELECT * FROM Product; REVERT;
0 Yorum