Zoeken…


RLS-filterpredikaat

Met Sql Server 2016+ en Azure Sql-database kunt u automatisch rijen filteren die in select statement worden geretourneerd met behulp van een predikaat. Deze functie wordt beveiliging op rijniveau genoemd .

Ten eerste hebt u een functie met tabelwaarde nodig die een bepaald predicaat bevat dat beschrijft wat de voorwaarde is waarmee gebruikers gegevens uit een tabel kunnen lezen:

DROP FUNCTION IF EXISTS dbo.pUserCanAccessCompany
GO
CREATE FUNCTION

dbo.pUserCanAccessCompany(@CompanyID int)

    RETURNS TABLE
    WITH SCHEMABINDING
AS RETURN (
    SELECT 1 as canAccess WHERE 

    CAST(SESSION_CONTEXT(N'CompanyID') as int) = @CompanyID

)

In dit voorbeeld zegt het predicaat dat alleen gebruikers die een waarde in SESSION_CONTEXT hebben die overeenkomt met het invoerargument, toegang hebben tot het bedrijf. U kunt elke andere voorwaarde instellen, bijvoorbeeld die de databaserol of database_id van de huidige gebruiker controleert, enz.

De meeste van de bovenstaande code is een sjabloon die u wilt kopiëren en plakken. Het enige dat hier zal veranderen, zijn de naam en argumenten van predikaat en voorwaarde in de clausule WHERE. Nu maakt u een beveiligingsbeleid dat dit predicaat op sommige tabellen toepast.

Nu kunt u een beveiligingsbeleid maken dat een predikaat op sommige tabellen toepast:

CREATE SECURITY POLICY dbo.CompanyAccessPolicy
    ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
    WITH (State=ON)

Dit beveiligingsbeleid kent predicaat toe aan bedrijfstabel. Wanneer iemand probeert gegevens uit de bedrijfstabel te lezen, past het beveiligingsbeleid predicaat toe op elke rij, geeft de kolom CompanyID door als parameter van het predicaat en wordt het predikaat geëvalueerd als deze rij wordt geretourneerd in het resultaat van de SELECT-query.

RLS beveiligingsbeleid wijzigen

Beveiligingsbeleid is een groep predicaten gekoppeld aan tabellen die samen kunnen worden beheerd. U kunt predikaten toevoegen of verwijderen of het gehele beleid in- of uitschakelen.

U kunt meer predicaten toevoegen aan tabellen in het bestaande beveiligingsbeleid.

ALTER SECURITY POLICY dbo.CompanyAccessPolicy
    ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company

U kunt enkele predicaten uit het beveiligingsbeleid verwijderen:

ALTER SECURITY POLICY dbo.CompanyAccessPolicy
    DROP FILTER PREDICATE ON dbo.Company

U kunt het beveiligingsbeleid uitschakelen

ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );  

U kunt beveiligingsbeleid inschakelen dat is uitgeschakeld:

ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );  

Voorkomen bijgewerkt met behulp van RLS-blokpredikaat

Met beveiliging op rijniveau kunt u enkele predicaten definiëren die bepalen wie rijen in de tabel kan bijwerken. Eerst moet u een tabelwaardefunctie definiëren die het predicaat voorstelt dat het toegangsbeleid beheert.

CREËER FUNCTIE

dbo.pUserCanAccessProduct (@CompanyID int)

RETURNS TABLE
WITH SCHEMABINDING

ALS RETOUR (SELECT 1 als canAccess WAAR

CAST (SESSION_CONTEXT (N'CompanyID ') als int) = @CompanyID

) In dit voorbeeld zegt het predicaat dat alleen gebruikers die een waarde in SESSION_CONTEXT hebben die overeenkomt met het invoerargument, toegang hebben tot het bedrijf. U kunt elke andere voorwaarde instellen, bijvoorbeeld die de databaserol of database_id van de huidige gebruiker controleert, enz.

De meeste van de bovenstaande code is een sjabloon die u wilt kopiëren en plakken. Het enige dat hier zal veranderen, zijn de naam en argumenten van predikaat en voorwaarde in de clausule WHERE. Nu maakt u een beveiligingsbeleid dat dit predicaat op sommige tabellen toepast.

Nu kunnen we beveiligingsbeleid maken met het predicaat dat updates op producttabel blokkeert als de CompanyID-kolom in de tabel niet voldoet aan het predicaat.

CREËER VEILIGHEIDSBELEID dbo.ProductAccessPolicy VOEG BLOK VOORSPELLEN dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product

Dit predicaat zal op alle operaties worden toegepast. Als u predicaat wilt toepassen op een bewerking, kunt u iets schrijven als:

CREËER VEILIGHEIDSBELEID dbo.ProductAccessPolicy VOEG BLOK VOORSPELLEN dbo.pUserCanAccessProduct (CompanyID) OP dbo.Product NA INVOEGEN

Mogelijke opties die u kunt toevoegen na de definitie van het blokpredikaat zijn:

[{NA {INSERT | BIJWERKEN } }
| {VOOR {UPDATE | VERWIJDEREN}}]



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow