다음을 통해 공유


데이터 API 작성기에서 세션 컨텍스트를 사용하여 행 수준 보안 구현

SQL의 세션 컨텍스트 기능을 사용하여 데이터 API 작성기에서 행 수준 보안을 구현합니다.

사전 요구 사항

  • 기존 SQL 서버 및 데이터베이스.
  • 데이터 API 작성기 CLI. CLI 설치
  • 데이터베이스 클라이언트(SQL Server Management Studio, Azure Data Studio 등)

SQL 테이블 및 데이터 Create

이 예제 시나리오에서 사용할 가상 데이터가 있는 테이블을 Create.

  1. 원하는 클라이언트 또는 도구를 사용하여 SQL 데이터베이스에 연결합니다.

  2. , , revenuecategoryusername 열이 있는 라는 Revenuesid테이블을 Create.

    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. 표에 4개의 샘플 책 행을 Revenues 삽입합니다.

    INSERT INTO dbo.Revenues VALUES
        (1, 'Book', 5000, 'Oscar'),  
        (2, 'Comics', 10000, 'Oscar'),  
        (3, 'Journals', 20000, 'Hannah'),  
        (4, 'Series', 40000, 'Hannah')
    GO
    
  4. 간단한 SELECT * 쿼리를 사용하여 데이터를 테스트합니다.

    SELECT * FROM dbo.Revenues
    
  5. RevenuesPredicate이라는 함수를 만듭니다. 이 함수는 현재 세션 컨텍스트에 따라 결과를 필터링합니다.

    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. 함수를 사용하여 라는 RevenuesSecurityPolicy 보안 정책을 Create.

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

도구 실행

DAB(Data API Builder) 도구를 실행하여 구성 파일 및 단일 엔터티를 생성합니다.

  1. 를 true로 설정하는 --set-session-context 동안 새 구성을 Create.

    dab init \
        --database-type mssql \
        --connection-string "<sql-connection-string>" \
        --set-session-context true
    
  2. 테이블에 대해 라는 revenue 새 엔터티를 추가합니다 dbo.Revenues .

    dab add revenue \
        --source "dbo.Revenues" \
        --permissions "anonymous:read"
    
  3. 데이터 API 작성기 도구를 시작합니다.

    dab start
    
  4. 엔드포인트로 http://localhost:5000/api/revenue 이동합니다. 데이터가 반환되지 않는지 확인합니다. 이 동작은 세션 컨텍스트가 설정되지 않고 필터 조건자와 일치하는 레코드가 없기 때문에 발생합니다.

SQL에서 테스트

SQL에서 필터 및 조건자를 직접 테스트하여 작동하는지 확인합니다.

  1. 원하는 클라이언트 또는 도구를 사용하여 SQL Server에 다시 연결합니다.

  2. sp_set_session_context 실행하여 세션 컨텍스트의 name 클레임을 정적 값 Oscar으로 수동으로 설정합니다.

    EXEC sp_set_session_context 'name', 'Oscar';
    
  3. 일반적인 SELECT * 쿼리를 실행합니다. 결과가 조건자를 사용하여 자동으로 필터링되는지 확인합니다.

    SELECT * FROM dbo.Revenues;