데이터 API 작성기에서 세션 컨텍스트를 사용하여 행 수준 보안 구현
SQL의 세션 컨텍스트 기능을 사용하여 데이터 API 작성기에서 행 수준 보안을 구현합니다.
사전 요구 사항
- 기존 SQL 서버 및 데이터베이스.
- 데이터 API 작성기 CLI. CLI 설치
- 데이터베이스 클라이언트(SQL Server Management Studio, Azure Data Studio 등)
- 클라이언트가 설치되지 않은 경우 Azure Data Studio를 설치합니다.
SQL 테이블 및 데이터 Create
이 예제 시나리오에서 사용할 가상 데이터가 있는 테이블을 Create.
원하는 클라이언트 또는 도구를 사용하여 SQL 데이터베이스에 연결합니다.
, ,
revenue
category
및username
열이 있는 라는Revenues
id
테이블을 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
표에 4개의 샘플 책 행을
Revenues
삽입합니다.INSERT INTO dbo.Revenues VALUES (1, 'Book', 5000, 'Oscar'), (2, 'Comics', 10000, 'Oscar'), (3, 'Journals', 20000, 'Hannah'), (4, 'Series', 40000, 'Hannah') GO
간단한
SELECT *
쿼리를 사용하여 데이터를 테스트합니다.SELECT * FROM dbo.Revenues
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));
함수를 사용하여 라는
RevenuesSecurityPolicy
보안 정책을 Create.CREATE SECURITY POLICY dbo.RevenuesSecurityPolicy ADD FILTER PREDICATE dbo.RevenuesPredicate(username) ON dbo.Revenues;
도구 실행
DAB(Data API Builder) 도구를 실행하여 구성 파일 및 단일 엔터티를 생성합니다.
를 true로 설정하는
--set-session-context
동안 새 구성을 Create.dab init \ --database-type mssql \ --connection-string "<sql-connection-string>" \ --set-session-context true
테이블에 대해 라는
revenue
새 엔터티를 추가합니다dbo.Revenues
.dab add revenue \ --source "dbo.Revenues" \ --permissions "anonymous:read"
데이터 API 작성기 도구를 시작합니다.
dab start
엔드포인트로
http://localhost:5000/api/revenue
이동합니다. 데이터가 반환되지 않는지 확인합니다. 이 동작은 세션 컨텍스트가 설정되지 않고 필터 조건자와 일치하는 레코드가 없기 때문에 발생합니다.
SQL에서 테스트
SQL에서 필터 및 조건자를 직접 테스트하여 작동하는지 확인합니다.
원하는 클라이언트 또는 도구를 사용하여 SQL Server에 다시 연결합니다.
를
sp_set_session_context
실행하여 세션 컨텍스트의name
클레임을 정적 값Oscar
으로 수동으로 설정합니다.EXEC sp_set_session_context 'name', 'Oscar';
일반적인
SELECT *
쿼리를 실행합니다. 결과가 조건자를 사용하여 자동으로 필터링되는지 확인합니다.SELECT * FROM dbo.Revenues;