Buscar..


Predicado del filtro RLS

La base de datos de Sql Server 2016+ y Azure Sql le permite filtrar automáticamente las filas que se devuelven en la declaración de selección utilizando algún predicado. Esta característica se llama seguridad de nivel de fila .

Primero, necesita una función con valores de tabla que contenga algún predicado que describa cuál es la condición que permitirá a los usuarios leer datos de alguna tabla:

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

)

En este ejemplo, el predicado dice que solo los usuarios que tienen un valor en SESSION_CONTEXT que coincide con el argumento de entrada pueden acceder a la empresa. Puede poner cualquier otra condición, por ejemplo, que verifique el rol de la base de datos o el ID de base de datos del usuario actual, etc.

La mayoría del código anterior es una plantilla que copiará y pegará. Lo único que cambiará aquí es el nombre y los argumentos del predicado y la condición en la cláusula WHERE. Ahora crea una política de seguridad que aplicará este predicado en alguna tabla.

Ahora puede crear una política de seguridad que aplicará predicado en alguna tabla:

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

Esta política de seguridad asigna predicado a la tabla de la empresa. Cada vez que alguien intente leer datos de la tabla de la Compañía, la política de seguridad aplicará el predicado en cada fila, pasará la columna CompanyID como parámetro del predicado, y el predicado evaluará si esta fila se devuelve en el resultado de la consulta SELECT.

Alterar la política de seguridad RLS

La política de seguridad es un grupo de predicados asociados a tablas que pueden administrarse juntas. Puede agregar, eliminar predicados o activar / desactivar toda la política.

Puede agregar más predicados en las tablas en la política de seguridad existente.

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

Puedes eliminar algunos predicados de la política de seguridad:

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

Puede deshabilitar la política de seguridad

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

Puede habilitar la política de seguridad que fue deshabilitada:

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

Previniendo actualización usando predicado de bloque RLS

La seguridad a nivel de fila le permite definir algunos predicados que controlarán quién podría actualizar las filas en la tabla. Primero debe definir alguna función de valor de tabla que represente el predicado que controlará la política de acceso.

CREAR FUNCION

dbo.pUserCanAccessProduct (@CompanyID int)

RETURNS TABLE
WITH SCHEMABINDING

COMO VOLVER (SELECCIONE 1 como puedeAccesar DONDE

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

) En este ejemplo, el predicado dice que solo los usuarios que tienen un valor en SESSION_CONTEXT que coincide con el argumento de entrada pueden acceder a la empresa. Puede poner cualquier otra condición, por ejemplo, que verifique el rol de la base de datos o el ID de base de datos del usuario actual, etc.

La mayoría del código anterior es una plantilla que copiará y pegará. Lo único que cambiará aquí es el nombre y los argumentos del predicado y la condición en la cláusula WHERE. Ahora crea una política de seguridad que aplicará este predicado en alguna tabla.

Ahora podemos crear una política de seguridad con el predicado que bloqueará las actualizaciones en la tabla de productos si la columna CompanyID en la tabla no satisface el predicado.

CREAR LA POLÍTICA DE SEGURIDAD dbo.ProductAccessPolicy AGREGAR PREDICACIÓN DE BLOQUE dbo.pUserCanAccessProduct (CompanyID) EN dbo.Product

Este predicado se aplicará en todas las operaciones. Si desea aplicar predicado en alguna operación, puede escribir algo como:

CREAR LA POLÍTICA DE SEGURIDAD dbo.ProductAccessPolicy AGREGAR BLOQUEAR PREDICAR dbo.pUserCanAccessProduct (CompanyID) EN dbo.Product DESPUÉS DE INSERTAR

Las opciones posibles que puede agregar después de la definición del predicado de bloque son:

[{AFTER {INSERT | ACTUALIZACIÓN}}
| {ANTES de {ACTUALIZACIÓN | BORRAR } } ]



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow