Szukaj…


Predykat filtra RLS

Sql Server 2016+ i baza danych Azure Sql umożliwia automatyczne filtrowanie wierszy zwracanych w instrukcji select przy użyciu niektórych predykatów. Ta funkcja nazywa się Zabezpieczeniami na poziomie wiersza .

Po pierwsze, potrzebujesz funkcji o wartościach przechowywanych w tabeli, która zawiera predykat, który opisuje, co to warunek, który pozwoli użytkownikom odczytać dane z niektórych tabel:

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

)

W tym przykładzie predykat mówi, że tylko użytkownicy, którzy mają wartość w SESSION_CONTEXT, która jest zgodna z argumentem wejściowym, mogą uzyskać dostęp do firmy. Możesz postawić dowolny inny warunek, np. Sprawdzający rolę bazy danych lub identyfikator_bazy bieżącego użytkownika itp.

Większość powyższego kodu to szablon, który skopiujesz i wkleisz. Jedyne, co się tutaj zmieni, to nazwa i argumenty predykatu i warunku w klauzuli WHERE. Teraz tworzysz zasady bezpieczeństwa, które zastosują ten predykat na niektórych tabelach.

Teraz możesz utworzyć politykę bezpieczeństwa, która będzie stosować predykat na niektórych tabelach:

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

Ta polityka bezpieczeństwa przypisuje predykat do tabeli firmy. Ilekroć ktoś próbuje odczytać dane z tabeli firmowej, polityka bezpieczeństwa zastosuje predykat w każdym wierszu, przekaże kolumnę CompanyID jako parametr predykatu i predykat oceni, czy ten wiersz zostanie zwrócony w wyniku zapytania SELECT.

Zmiana polityki bezpieczeństwa RLS

Polityka bezpieczeństwa to grupa predykatów powiązanych z tabelami, którymi można zarządzać razem. Możesz dodawać lub usuwać predykaty lub włączać / wyłączać całe zasady.

Możesz dodać więcej predykatów do tabel w istniejącej polityce bezpieczeństwa.

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

Możesz usunąć niektóre predykaty z polityki bezpieczeństwa:

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

Możesz wyłączyć politykę bezpieczeństwa

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

Możesz włączyć zasady bezpieczeństwa, które zostały wyłączone:

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

Zapobieganie aktualizacji przy użyciu predykatu bloku RLS

Zabezpieczenia na poziomie wiersza umożliwiają zdefiniowanie niektórych predykatów, które będą kontrolować, kto może aktualizować wiersze w tabeli. Najpierw musisz zdefiniować funkcję tabeli-wartości, która reprezentuje predykat, który będzie kontrolował politykę dostępu.

UTWÓRZ FUNKCJĘ

dbo.pUserCanAccessProduct (@CompanyID int)

RETURNS TABLE
WITH SCHEMABINDING

JAK ZWROTU (WYBIERZ 1 jako canDostęp GDZIE

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

) W tym przykładzie predykat mówi, że tylko użytkownicy o wartości SESSION_CONTEXT, która jest zgodna z argumentem wejściowym, mogą uzyskać dostęp do firmy. Możesz postawić dowolny inny warunek, np. Sprawdzający rolę bazy danych lub identyfikator_bazy bieżącego użytkownika itp.

Większość powyższego kodu to szablon, który skopiujesz i wkleisz. Jedyne, co się tutaj zmieni, to nazwa i argumenty predykatu i warunku w klauzuli WHERE. Teraz tworzysz zasady bezpieczeństwa, które zastosują ten predykat na niektórych tabelach.

Teraz możemy utworzyć strategię bezpieczeństwa z predykatem, który zablokuje aktualizacje w tabeli produktów, jeśli kolumna CompanyID w tabeli nie spełni predykatu.

STWÓRZ POLITYKĘ BEZPIECZEŃSTWA dbo.ProductAccessPolicy DODAJ BLOKADĘ PRZEDSTAWICIEL dbo.pUserCanAccessProduct (CompanyID) NA dbo.Product

Ten predykat zostanie zastosowany do wszystkich operacji. Jeśli chcesz zastosować predykat do niektórych operacji, możesz napisać coś takiego:

STWÓRZ POLITYKĘ BEZPIECZEŃSTWA dbo.ProductAccessPolicy DODAJ BLOKADĘ PEDAKTY dbo.pUserCanAccessProduct (CompanyID) NA dbo.Produkt PO WSTAWIENIU

Możliwe opcje, które można dodać po definicji predykatu bloku, to:

[{PO {WSTAWIĆ | AKTUALIZACJA } }
| {PRZED {AKTUALIZACJĄ | USUNĄĆ } } ]



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow