Azure Synapse SQL池基于列值与Azure AD身份实现RLS的方法
在Azure Synapse专用SQL池中实现基于Azure AD身份的行级安全(RLS)
首先明确:Azure Synapse无服务器SQL池目前不支持行级安全(RLS),仅专用SQL池支持该功能,以下实现步骤基于专用SQL池。
前提准备
- 将Azure AD组A、组B,以及用户A、用户B添加为专用SQL池的数据库用户:
-- 创建AD组A对应的数据库用户 CREATE USER [AzureAD\组A名称] FROM EXTERNAL PROVIDER; -- 创建AD组B对应的数据库用户 CREATE USER [AzureAD\组B名称] FROM EXTERNAL PROVIDER; -- 若需单独对用户A、B设置权限,可创建对应数据库用户 CREATE USER [AzureAD\用户A名称] FROM EXTERNAL PROVIDER; CREATE USER [AzureAD\用户B名称] FROM EXTERNAL PROVIDER;
- 确保目标表(假设表名为
user_data)已存在并包含指定数据:
CREATE TABLE user_data ( name VARCHAR(50), visibility VARCHAR(20) ); INSERT INTO user_data VALUES ('Bob', 'public'), ('Andrew', 'hide');
步骤1:创建RLS谓词函数
该函数会根据当前登录的Azure AD身份,返回允许访问的行过滤条件:
CREATE FUNCTION dbo.fn_security_predicate() RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS is_allowed WHERE -- 组B/用户B可查看所有行 IS_MEMBER('AzureAD\组B名称') = 1 OR SUSER_SNAME() = 'AzureAD\用户B名称' -- 组A/用户A仅能查看visibility为public的行 OR ( (IS_MEMBER('AzureAD\组A名称') = 1 OR SUSER_SNAME() = 'AzureAD\用户A名称') AND visibility = 'public' );
说明:
IS_MEMBER()用于校验当前用户是否属于指定的数据库用户(对应Azure AD组)SUSER_SNAME()返回当前登录的Azure AD用户完整标识(格式为AzureAD\用户UPN或名称)
步骤2:创建行级安全策略
将谓词函数绑定到目标表,启用行级过滤:
CREATE SECURITY POLICY dbo.user_data_security_policy ADD FILTER PREDICATE dbo.fn_security_predicate() ON dbo.user_data WITH (STATE = ON);
验证效果
- 当AD组A/用户A登录查询时,仅返回
visibility='public'的行:
SELECT * FROM user_data; -- 结果仅包含Bob的记录
- 当AD组B/用户B登录查询时,返回所有行:
SELECT * FROM user_data; -- 结果包含Bob和Andrew的记录
注意事项
- 若Azure AD组名称包含特殊字符,需用方括号包裹,例如
[AzureAD\组B名称(含空格)] - 执行上述操作的账号需具备
ALTER ANY SECURITY POLICY和CREATE FUNCTION权限 - 如需修改访问规则,更新谓词函数后重新启用安全策略即可
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

