Compartir a través de


Implementación de la seguridad de nivel de fila con contexto de sesión en Data API Builder

Use la característica de contexto de sesión de SQL para implementar la seguridad de nivel de fila en el generador de Data API.

Requisitos previos

Create tabla y datos de SQL

Create una tabla con datos ficticios que se usarán en este escenario de ejemplo.

  1. Conéctese a la base de datos SQL mediante su cliente o herramienta preferidos.

  2. Create una tabla denominada Revenues con idcolumnas , category, revenuey username .

    DROP TABLE IF EXISTS dbo.Revenues;
    
    CREATE TABLE dbo.Revenues(
        id int PRIMARY KEY,  
        category varchar(max) NOT NULL,  
        revenue int,  
        username varchar(max) NOT NULL  
    );
    GO
    
  3. Inserte cuatro filas de libro de ejemplo en la Revenues tabla.

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    
  4. Pruebe los datos con una consulta sencilla SELECT * .

    SELECT * FROM dbo.Revenues
    
  5. Cree una función denominada RevenuesPredicate. Esta función filtrará los resultados en función del contexto de sesión actual.

    CREATE FUNCTION dbo.RevenuesPredicate(@username varchar(max))
    RETURNS TABLE
    WITH SCHEMABINDING
    AS RETURN SELECT 1 AS fn_securitypredicate_result
    WHERE @username = CAST(SESSION_CONTEXT(N'name') AS varchar(max));
    
  6. Create una directiva de seguridad denominada RevenuesSecurityPolicy mediante la función .

    CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy
    ADD FILTER PREDICATE dbo.RevenuesPredicate(username)
    ON dbo.Revenues;
    

Ejecutar herramienta

Ejecute la herramienta Generador de API de datos (DAB) para generar un archivo de configuración y una sola entidad.

  1. Create una nueva configuración al establecer --set-session-context en true.

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true
    
  2. Agregue una nueva entidad denominada revenue para la dbo.Revenues tabla.

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "anonymous:read"
    
  3. Inicie la herramienta Generador de API de datos.

    dab start
    
  4. Vaya al punto de http://localhost:5000/api/revenue conexión. Observe que no se devuelve ningún dato. Este comportamiento se produce porque el contexto de sesión no está establecido y no hay registros que coincidan con el predicado de filtro.

Prueba en SQL

Pruebe el filtro y el predicado en SQL directamente para asegurarse de que funciona.

  1. Vuelva a conectarse al servidor SQL Server con su cliente o herramienta preferidos.

  2. sp_set_session_context Ejecute para establecer manualmente la notificación del contexto de name sesión en el valor Oscarestático .

    EXEC sp_set_session_context 'name', 'Oscar';
    
  3. Ejecute una consulta típica SELECT * . Observe que los resultados se filtran automáticamente mediante el predicado.

    SELECT * FROM dbo.Revenues;