Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usare la funzionalità del contesto di sessione di SQL per implementare la sicurezza a livello di riga in Generatore API dati.
Prerequisiti
- Sql Server e database esistenti.
- CLI generatore di API dati. Installare l'interfaccia della riga di comando
Creare una tabella e dati SQL
Creare una tabella con dati fittizi da usare in questo scenario di esempio.
Connettersi al database SQL usando il client o lo strumento preferito.
Creare una tabella denominata
Revenuescon le colonneid,category,revenueeaccessible_role.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 ); GOInserire quattro righe di esempio nella
Revenuestabella.INSERT INTO dbo.Revenues VALUES (1, 'Book', 5000, 'Oscar'), (2, 'Comics', 10000, 'Oscar'), (3, 'Journals', 20000, 'Hannah'), (4, 'Series', 40000, 'Hannah') GOIn questo esempio, la colonna
accessible_rolearchivia il nome del ruolo che può accedere alla riga.Testate i vostri dati con una semplice query
SELECT *.SELECT * FROM dbo.RevenuesCreare una funzione denominata
RevenuesPredicate. Questa funzione filtra i risultati in base al contesto di sessione corrente.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));Creare un criterio di sicurezza denominato
RevenuesSecurityPolicyusando la funzione .CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy ADD FILTER PREDICATE dbo.RevenuesPredicate(accessible_role) ON dbo.Revenues;
(Facoltativo) Creare una stored procedure
Questa sezione illustra un semplice modello "hello world" per l'uso dei valori di contesto della sessione direttamente in T-SQL.
Creare una stored procedure che legge il valore del contesto della sessione
rolese lo utilizza per filtrare i risultati.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
Eseguire lo strumento
Eseguire lo strumento Data API Builder (DAB) per generare un file di configurazione e una singola entità.
Creare una nuova configurazione impostando
--set-session-contextsu true.dab init \ --database-type mssql \ --connection-string "<sql-connection-string>" \ --set-session-context true \ --auth.provider SimulatorQuando il contesto di sessione è abilitato per SQL Server, Generatore API dati invia attestazioni utente autenticate a SQL chiamando
sp_set_session_context(ad esempio,roles). L'abilitazione del contesto della sessione disabilita anche la memorizzazione nella cache delle risposte per l'origine dati.Aggiungere una nuova entità denominata
revenueper ladbo.Revenuestabella.dab add revenue \ --source "dbo.Revenues" \ --permissions "Authenticated:read"Avviare lo strumento Generatore API dati.
dab startEseguire una query sull'endpoint senza specificare un ruolo effettivo. Osservare che non vengono restituiti dati perché il ruolo effettivo è impostato su
Authenticated.curl http://localhost:5000/api/revenueEseguire una query sull'endpoint impostando il ruolo effettivo su
Oscar. Osservare che i risultati filtrati includono solo leOscarrighe.curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenueRipeti utilizzando il ruolo
Hannah.curl -H "X-MS-API-ROLE: Hannah" http://localhost:5000/api/revenue
Test in SQL
Testare direttamente il filtro e il predicato in SQL per assicurarsi che funzioni.
Connettersi di nuovo a SQL Server usando il client o lo strumento preferito.
Esegui il
sp_set_session_contextper impostare manualmente l'attestazionerolesdel contesto sessione al valore staticoOscar.EXEC sp_set_session_context 'roles', 'Oscar';Esegue una query tipica
SELECT *. Osservare che i risultati vengono filtrati automaticamente usando il predicato.SELECT * FROM dbo.Revenues;(Facoltativo) Eseguire una query sulla tabella utilizzando la stored procedure.
EXEC dbo.GetRevenuesForCurrentRole;