Compartilhar via


Implementar a segurança em nível de linha com contexto de sessão no Construtor de API de Dados

Use o recurso de contexto de sessão do SQL para implementar a segurança em nível de linha no construtor de API de Dados.

Pré-requisitos

  • SQL Server e banco de dados existentes.
  • CLI do construtor de API de Dados. Instalar a CLI

Criar dados e tabelas SQL

Crie uma tabela com dados fictícios para usar neste cenário de exemplo.

  1. Conecte-se ao banco de dados SQL usando seu cliente ou ferramenta preferencial.

  2. Crie uma tabela nomeada Revenues comid, , categoryrevenuee username colunas.

    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. Insira quatro linhas de livro de exemplo na Revenues tabela.

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    
  4. Teste seus dados com uma consulta simples SELECT * .

    SELECT * FROM dbo.Revenues
    
  5. Criar uma função chamada RevenuesPredicate. Essa função filtrará os resultados com base no contexto da sessão atual.

    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. Crie uma política de segurança chamada RevenuesSecurityPolicy usando a função.

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

Executar ferramenta

Execute a ferramenta DAB (Construtor de API de Dados) para gerar um arquivo de configuração e uma única entidade.

  1. Crie uma nova configuração ao definir --set-session-context como true.

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true
    
  2. Adicione uma nova entidade nomeada revenue para a dbo.Revenues tabela.

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "anonymous:read"
    
  3. Inicie a ferramenta Data API Builder.

    dab start
    
  4. Navegue até o http://localhost:5000/api/revenue endpoint. Observe que nenhum dado é retornado. Esse comportamento ocorre porque o contexto da sessão não está definido e nenhum registro corresponde ao predicado de filtro.

Testar no SQL

Teste o filtro e o predicado diretamente no SQL para garantir que ele esteja funcionando.

  1. Conecte-se ao SQL Server novamente usando seu cliente ou ferramenta preferencial.

  2. Execute o sp_set_session_context para definir manualmente a alegação do contexto de sessão de name para o valor estático Oscar.

    EXEC sp_set_session_context 'name', 'Oscar';
    
  3. Execute uma consulta típica SELECT * . Observe que os resultados são filtrados automaticamente usando o predicado.

    SELECT * FROM dbo.Revenues;