Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Veri API'sinin oluşturucusunda satır düzeyi güvenlik uygulamak için SQL'in oturum bağlamı özelliğini kullanın.
Önemli
SQL Server satır düzeyi güvenlik ile oturum bağlamı, Veri API'sini oluşturucu veritabanı ilkelerinden farklıdır. Veritabanı ilkeleri (örneğin, --policy-database "@item.owner eq @claims.user_id") Data API Builder tarafından WHERE yan tümcelerine dönüştürülürken, oturum bağlamı talepleri SQL Server'a ileterek SQL yerel satır düzeyi güvenliğin filtrelemeyi işlemesini sağlar.
Önkoşullar
- Mevcut SQL sunucusu ve veritabanı.
- Veri API'si oluşturucu CLI. CLI'yi yükleme
Uyarı
Oturum bağlamı şu şekilde desteklenir:
- SQL Server 2016 ve üzeri
- Azure SQL Veritabanı
- Azure Synapse Analytics (Ayrılmış SQL havuzu)
- Azure Synapse Analytics (Sunucusuz SQL havuzu) desteklenmiyor
SQL tablosu ve verileri oluşturma
Bu örnek senaryoda kullanmak üzere kurgusal verilerle bir tablo oluşturun.
Tercih ettiğiniz istemciyi veya aracı kullanarak SQL veritabanına bağlanın.
Revenuesadlıid,category,revenueveaccessible_rolesütunlarıyla bir tablo oluşturun.DROP TABLE IF EXISTS dbo.Revenues; CREATE TABLE dbo.Revenues( id int PRIMARY KEY, category varchar(max) NOT NULL, revenue int, accessible_role varchar(max) NOT NULL ); GOTabloya
Revenuesdört örnek satır ekleyin.INSERT INTO dbo.Revenues VALUES (1, 'Book', 5000, 'Oscar'), (2, 'Comics', 10000, 'Oscar'), (3, 'Journals', 20000, 'Hannah'), (4, 'Series', 40000, 'Hannah') GOBu örnekte sütun,
accessible_rolesatıra erişebilecek rol adını depolar.
Tavsiye
Yaygın oturum bağlamı kullanım örnekleri:
- Rol tabanlı filtreleme (burada gösterildiği gibi) kullanarak
roles - Çok kiracılı yalıtım kullanarak
tenant_id - Kullanıcıya özel filtreleme kullanarak
user_id
Verilerinizi basit
SELECT *bir sorguyla test edin.SELECT * FROM dbo.RevenuesRevenuesPredicateadlı bir işlev oluşturun. Bu işlev sonuçları geçerli oturum bağlamını temel alarak filtreler.CREATE FUNCTION dbo.RevenuesPredicate(@accessible_role varchar(max)) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE @accessible_role = CAST(SESSION_CONTEXT(N'roles') AS varchar(max));işlevini kullanarak adlı
RevenuesSecurityPolicybir güvenlik ilkesi oluşturun.CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy ADD FILTER PREDICATE dbo.RevenuesPredicate(accessible_role) ON dbo.Revenues;
Uyarı
Yan WITH SCHEMABINDING tümcesi güvenlik ilkelerinde kullanılan işlevler için gereklidir, bu nedenle temel alınan şema değişiklikleri koşulu geçersiz kılmaz.
(İsteğe bağlı) Saklı bir yordam oluştur.
Bu bölümde doğrudan T-SQL'de oturum bağlamı değerlerini kullanmaya yönelik basit bir "merhaba dünya" deseni gösterilmektedir.
rolesoturum bağlam değerini okuyan ve sonuçları filtrelemek için kullanan bir saklı yordam oluşturun.CREATE OR ALTER PROCEDURE dbo.GetRevenuesForCurrentRole AS BEGIN SET NOCOUNT ON; DECLARE @role varchar(max) = CAST(SESSION_CONTEXT(N'roles') AS varchar(max)); SELECT id, category, revenue, accessible_role FROM dbo.Revenues WHERE accessible_role = @role; END GO
Aracı çalıştır
Bir yapılandırma dosyası ve tek bir varlık oluşturmak için Veri API oluşturucusu (DAB) aracını çalıştırın.
--set-session-context'yi true olarak ayarlarken yeni bir yapılandırma oluşturun.dab init \ --database-type mssql \ --connection-string "<sql-connection-string>" \ --set-session-context true \ --auth.provider SimulatorSQL Server için oturum bağlamı etkinleştirildiğinde, Veri API oluşturucusu çağrısı
sp_set_session_contextyaparak kimliği doğrulanmış kullanıcı taleplerini SQL'e gönderir (örneğin,roles). Oturum bağlamı etkinleştirildiğinde bu veri kaynağı için yanıt önbelleğe alma devre dışı bırakılır.
Uyarı
Etkinleştirildiğinde set-session-context , veri kaynağı için yanıt önbelleğe alma devre dışı bırakılır. Yüksek trafikli senaryolar için performansı test etmeyi, koşul sütununu dizine eklemeyi veya gereksinimlerinizi karşılarken Veri API'si oluşturucu veritabanı ilkelerini kullanmayı göz önünde bulundurun.
revenuetablosu içindbo.Revenuesadlı yeni bir varlık ekleyin.dab add revenue \ --source "dbo.Revenues" \ --permissions "Authenticated:read"Veri API'sini oluşturucu aracını başlatın.
dab startEtkili bir rol belirtmeden uç noktayı sorgular. Aşağıdaki nedenden dolayı veri döndürülmediğini gözlemleyin:
- Etkin rol varsayılan olarak olarak
Authenticatedbelirlenir. - Hiçbir satırda
accessible_role = 'Authenticated'yok. - Güvenlik ilkesi, rol eşleşmediğinde sonuçları filtreler.
curl http://localhost:5000/api/revenue- Etkin rol varsayılan olarak olarak
Etkin rolü
Oscarolarak ayarlayarak uç noktayı sorgula. Filtrelenen sonuçların yalnızcaOscarsatırlarını içerdiğini gözlemleyin.curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenueHannahrolünü tekrarlayın.curl -H "X-MS-API-ROLE: Hannah" http://localhost:5000/api/revenue
GraphQL ile test
Oturum bağlamı GraphQL sorgularıyla da çalışır.
query {
revenues {
items {
id
category
revenue
accessible_role
}
}
}
Rol başlığını iletin.
curl -X POST http://localhost:5000/graphql \
-H "Content-Type: application/json" \
-H "X-MS-API-ROLE: Oscar" \
-d '{"query": "{ revenues { items { id category revenue accessible_role } } }"}'
Veri API'si oluşturucusu SQL Server'a ne gönderir?
Oturum bağlamı etkinleştirildiğinde, Veri API oluşturucusu sorgunuzu yürütmeden önce her istekte oturum bağlamı değerlerini ayarlar.
EXEC sp_set_session_context 'roles', 'Oscar', @read_only = 0;
-- Then executes your query
SELECT * FROM dbo.Revenues;
Kimliği doğrulanmış tüm kullanıcı talepleri anahtar-değer çiftleri olarak gönderilir. Yaygın talepler arasında , roles veya subve kimlik sağlayıcınızdan gelen tüm özel talepler bulunuroid.
SQL'de test
Çalıştığından emin olmak için doğrudan SQL'de filtreyi ve koşulu test edin.
Tercih ettiğiniz istemciyi veya aracı kullanarak SQL sunucusuna yeniden bağlanın.
sp_set_session_contextkomutunu çalıştırarak oturum bağlamınızınrolestalebini statik değerOscar'ye el ile ayarlayın.EXEC sp_set_session_context 'roles', 'Oscar';Tipik
SELECT *bir sorgu çalıştırın. Sonuçların koşul kullanılarak otomatik olarak filtrelendiğini gözlemleyin.SELECT * FROM dbo.Revenues;(İsteğe bağlı) Saklı yordamı kullanarak tabloyu sorgular.
EXEC dbo.GetRevenuesForCurrentRole;
Kaynakları temizle
Örnek nesneleri kaldırmak istiyorsanız şunu çalıştırın:
DROP SECURITY POLICY IF EXISTS dbo.RevenuesSecurityPolicy;
DROP FUNCTION IF EXISTS dbo.RevenuesPredicate;
DROP PROCEDURE IF EXISTS dbo.GetRevenuesForCurrentRole;
DROP TABLE IF EXISTS dbo.Revenues;
Sorun giderme
-
Sonuç döndürülmedi: Güvenlik ilkesinin etkin
SELECT * FROM sys.security_policies() olduğunu doğrulayın, oturum bağlam değerini ()SELECT SESSION_CONTEXT(N'roles')denetleyin ve Veri API'sini oluşturucu yapılandırmanızda ayarlandığını onaylayın--set-session-context true. -
Döndürülen tüm satırlar: Güvenlik ilkesinin devre dışı bırakılmadığını (
WITH STATE = OFF) ve koşulun yalnızca yetkili satırları döndürdüğünü1onaylayın. -
Performans sorunları: Koşul sütununu ()
accessible_roledizine alın ve performans etkisini yalıtmak için ilkeyi geçici olarak devre dışı bırakmayı göz önünde bulundurun.