Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Gebruik de sessiecontextfunctie van SQL om beveiliging op rijniveau te implementeren in Data API Builder.
Vereiste voorwaarden
- Bestaande SQL-server en -database.
- Data-API-bouwer CLI. De CLI installeren
SQL-tabel en -gegevens maken
Maak een tabel met fictieve gegevens die in dit voorbeeldscenario moeten worden gebruikt.
Maak verbinding met de SQL-database met behulp van uw favoriete client of hulpprogramma.
Maak een tabel genaamd
Revenuesmet de kolommenid,category,revenue, enaccessible_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 ); GOVoeg vier voorbeeldrijen in de
Revenuestabel in.INSERT INTO dbo.Revenues VALUES (1, 'Book', 5000, 'Oscar'), (2, 'Comics', 10000, 'Oscar'), (3, 'Journals', 20000, 'Hannah'), (4, 'Series', 40000, 'Hannah') GOIn dit voorbeeld wordt in de
accessible_rolekolom de rolnaam opgeslagen die toegang heeft tot de rij.Test uw gegevens met een eenvoudige
SELECT *query.SELECT * FROM dbo.RevenuesMaak een functie met de naam
RevenuesPredicate. Met deze functie worden resultaten gefilterd op basis van de huidige sessiecontext.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));Maak een beveiligingsbeleid met de naam
RevenuesSecurityPolicymet behulp van de functie.CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy ADD FILTER PREDICATE dbo.RevenuesPredicate(accessible_role) ON dbo.Revenues;
(Optioneel) Een opgeslagen procedure maken
In deze sectie ziet u een eenvoudig 'hallo wereld'-patroon voor het gebruik van sessiecontextwaarden rechtstreeks in T-SQL.
Maak een opgeslagen procedure die de waarde van de
rolessessiecontext leest en deze gebruikt om resultaten te filteren.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
Hulpprogramma uitvoeren
Voer het hulpprogramma Data API Builder (DAB) uit om een configuratiebestand en één entiteit te genereren.
Maak een nieuwe configuratie en stel deze in op
--set-session-contexttrue.dab init \ --database-type mssql \ --connection-string "<sql-connection-string>" \ --set-session-context true \ --auth.provider SimulatorWanneer sessiecontext is ingeschakeld voor SQL Server, verzendt Data API Builder geverifieerde gebruikersclaims naar SQL door aan te roepen
sp_set_session_context(bijvoorbeeldroles). Als u sessiecontext inschakelt, wordt ook de cache van reacties voor die gegevensbron uitgeschakeld.Voeg een nieuwe entiteit toe met de naam
revenuevan dedbo.Revenuestabel.dab add revenue \ --source "dbo.Revenues" \ --permissions "Authenticated:read"Start het hulpprogramma voor het maken van data-API's.
dab startVoer een query uit op het eindpunt zonder een effectieve rol op te geven. U ziet dat er geen gegevens worden geretourneerd omdat de effectieve rol standaard is ingesteld op
Authenticated.curl http://localhost:5000/api/revenueVoer een query uit op het eindpunt tijdens het instellen van de effectieve rol op
Oscar. U ziet dat de gefilterde resultaten alleen deOscarrijen bevatten.curl -H "X-MS-API-ROLE: Oscar" http://localhost:5000/api/revenueHerhaal dit met behulp van de
Hannahrol.curl -H "X-MS-API-ROLE: Hannah" http://localhost:5000/api/revenue
Testen in SQL
Test het filter en predicaat rechtstreeks in SQL om te controleren of het werkt.
Maak opnieuw verbinding met de SQL-server met behulp van uw favoriete client of hulpprogramma.
Voer de
sp_set_session_contextopdracht uit om de claim vanrolesuw sessiecontext handmatig in te stellen op de statische waardeOscar.EXEC sp_set_session_context 'roles', 'Oscar';Voer een typische
SELECT *query uit. U ziet dat de resultaten automatisch worden gefilterd met behulp van het predicaat.SELECT * FROM dbo.Revenues;(Optioneel) Voer een query uit op de tabel met behulp van de opgeslagen procedure.
EXEC dbo.GetRevenuesForCurrentRole;