Ricerca…


Predicato del filtro RLS

Sql Server 2016+ e il database Azure Sql consentono di filtrare automaticamente le righe restituite nell'istruzione select utilizzando un determinato predicato. Questa funzione è chiamata sicurezza a livello di riga .

Innanzitutto, è necessaria una funzione valutata a livello di tabella che contenga un predicato che descriva quale sia la condizione che consentirà agli utenti di leggere i dati da una tabella:

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 questo esempio, il predicato afferma che solo gli utenti che hanno un valore in SESSION_CONTEXT che corrisponde all'argomento di input possono accedere alla società. Puoi inserire qualsiasi altra condizione, ad es. Che controlli il ruolo del database o l'id_database dell'utente corrente, ecc.

La maggior parte del codice sopra riportato è un modello che verrà copiato e incollato. L'unica cosa che cambierà qui è il nome e gli argomenti di predicato e condizione nella clausola WHERE. Ora si creano criteri di sicurezza che applicheranno questo predicato su alcune tabelle.

Ora puoi creare una politica di sicurezza che applicherà il predicato su alcune tabelle:

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

Questa politica di sicurezza assegna un predicato alla tabella aziendale. Ogni volta che qualcuno tenta di leggere i dati dalla tabella Company, i criteri di sicurezza applicheranno il predicato su ogni riga, passeranno la colonna CompanyID come parametro del predicato e il predicato valuterà se questa riga verrà restituita nel risultato della query SELECT.

Modifica della politica di sicurezza RLS

La politica di sicurezza è un gruppo di predicati associati alle tabelle che possono essere gestiti insieme. È possibile aggiungere o rimuovere predicati o attivare / disattivare l'intera politica.

È possibile aggiungere più predicati sulle tabelle nella politica di sicurezza esistente.

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

È possibile eliminare alcuni predicati dalla politica di sicurezza:

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

È possibile disabilitare la politica di sicurezza

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

È possibile abilitare la politica di sicurezza che è stata disabilitata:

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

Impedire l'aggiornamento utilizzando il predicato del blocco RLS

La sicurezza a livello di riga consente di definire alcuni predicati che controlleranno chi potrebbe aggiornare le righe nella tabella. Per prima cosa è necessario definire una funzione valore di tabella che rappresenti un predicato che controllerà la politica di accesso.

CREA FUNZIONE

dbo.pUserCanAccessProduct (@CompanyID int)

RETURNS TABLE
WITH SCHEMABINDING

AS RETURN (SELEZIONA 1 come canAccess WHERE

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

) In questo esempio, il predicato afferma che solo gli utenti che hanno un valore in SESSION_CONTEXT che corrisponde all'argomento di input possono accedere alla società. Puoi inserire qualsiasi altra condizione, ad es. Che controlli il ruolo del database o l'id_database dell'utente corrente, ecc.

La maggior parte del codice sopra riportato è un modello che verrà copiato e incollato. L'unica cosa che cambierà qui è il nome e gli argomenti di predicato e condizione nella clausola WHERE. Ora si creano criteri di sicurezza che applicheranno questo predicato su alcune tabelle.

Ora possiamo creare una politica di sicurezza con il predicato che bloccherà gli aggiornamenti sulla tabella dei prodotti se la colonna CompanyID nella tabella non soddisfa il predicato.

CREARE LA POLITICA DI SICUREZZA dbo.ProductAccessPolicy AGGIUNGI BLOCCO PREDICA dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product

Questo predicato verrà applicato su tutte le operazioni. Se vuoi applicare il predicato su qualche operazione puoi scrivere qualcosa come:

CREA POLITICA DI SICUREZZA dbo.ProductAccessPolicy AGGIUNGI BLOCCO PREDICA dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product DOPO INSERIMENTO

Le possibili opzioni che è possibile aggiungere dopo la definizione del predicato del blocco sono:

[{DOPO {INSERIRE | AGGIORNARE } }
| {PRIMA {AGGIORNAMENTO | ELIMINA } } ]



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow