You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Databricks上使用安全策略包及实现角色基访问控制

Databricks 替代 SQL Server 安全策略的实现方案

Databricks 没有直接对应 SQL Server CREATE SECURITY POLICY 的语法,以下是等效的行级安全、角色访问控制、列级安全及数据掩码的实现方案,完全适配你的需求:

一、行级安全(RLS)实现(对应 SQL Server 的 Security Policy)

推荐通过动态视图或UDF+视图实现行级过滤,效果与 SQL Server 的筛选谓词一致:

1. UDF+视图实现用户行过滤

先创建匹配当前用户的函数(对应你 SQL Server 中的 mailfunction):

-- 创建判断用户匹配的UDF
CREATE OR REPLACE FUNCTION test.mailfunction(useremail STRING)
RETURNS BOOLEAN
RETURN useremail = current_user();

再创建过滤视图,用户仅能看到自己的数据:

-- 创建行级过滤视图
CREATE OR REPLACE VIEW test.users_filtered AS
SELECT *
FROM test.users
WHERE test.mailfunction(useremail);

最后限制用户仅能访问视图,禁止直接操作底层表:

-- 撤销对原表的访问权限
REVOKE SELECT ON test.users FROM `user@example.com`;
-- 授予视图访问权限
GRANT SELECT ON test.users_filtered TO `user@example.com`;

2. 动态视图简化实现

无需单独创建UDF,直接在视图中嵌入用户上下文判断:

CREATE OR REPLACE VIEW test.users_filtered AS
SELECT *
FROM test.users
WHERE useremail = current_user();

二、基于角色的访问控制(RBAC)

通过角色批量管理用户权限,替代分散的用户授权:

1. 创建角色并授权

-- 创建普通用户角色
CREATE ROLE test_user_role;

-- 给角色授予视图的查询权限
GRANT SELECT ON test.users_filtered TO test_user_role;

-- 如需允许角色修改数据,添加更新权限
GRANT UPDATE ON test.users_filtered TO test_user_role;

2. 将用户/组添加到角色

-- 单个用户加入角色
GRANT ROLE test_user_role TO `user@example.com`;

-- AD/LDAP组加入角色(批量管理更高效)
GRANT ROLE test_user_role TO `company_users_group@example.com`;

三、列级安全实现

通过视图隐藏敏感列,或直接按列粒度授权:

1. 视图隐藏敏感列

-- 创建仅展示非敏感列的视图
CREATE OR REPLACE VIEW test.users_columns_filtered AS
SELECT user_id, useremail, username
FROM test.users
WHERE useremail = current_user();

2. 直接按列授权(无需视图)

如果仅需限制列访问、无需行过滤:

-- 仅允许用户访问指定列
GRANT SELECT (user_id, useremail) ON test.users TO `user@example.com`;
-- 显式撤销敏感列的访问权限(默认未授权则无法访问)
REVOKE SELECT (phone, address) ON test.users FROM `user@example.com`;

四、数据掩码实现

通过UDF或视图对敏感数据进行部分隐藏,支持不同角色的掩码粒度:

1. 基础数据掩码示例

-- 创建邮箱掩码UDF
CREATE OR REPLACE FUNCTION test.mask_email(email STRING)
RETURNS STRING
RETURN CONCAT(SUBSTRING(email, 1, 2), '****@', SPLIT(email, '@')[1]);

-- 创建带掩码的视图
CREATE OR REPLACE VIEW test.users_masked AS
SELECT
  user_id,
  test.mask_email(useremail) AS masked_email,
  username,
  CONCAT(SUBSTRING(phone, 1, 3), '****', SUBSTRING(phone, 8)) AS masked_phone
FROM test.users
WHERE useremail = current_user();

2. 基于角色的差异化掩码

管理员查看完整数据,普通用户查看掩码数据:

CREATE OR REPLACE VIEW test.users_masked AS
SELECT
  user_id,
  CASE
    WHEN is_member('test_admin_role') THEN useremail
    ELSE test.mask_email(useremail)
  END AS useremail,
  username,
  CASE
    WHEN is_member('test_admin_role') THEN phone
    ELSE CONCAT(SUBSTRING(phone, 1, 3), '****', SUBSTRING(phone, 8))
  END AS phone
FROM test.users
WHERE useremail = current_user();

内容的提问来源于stack exchange,提问作者poornachandran r

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:22:07