SQLServer,暂时禁用行级安全性

问题描述 投票:0回答:1

我在Person表中的SQLServer中实现了行级安全性(以满足GDPR要求),以便基本用户只能看到个人记录的子集。 Person表具有一些在系统中必须唯一的数据(RFID标签)。所以我的应用程序检查没有重复的RFIDtag。

如何在RLS启用时进行此检查,因为查询只能查看行的子集,但RFID必须是全局唯一的?暂时禁用RLS运行此查询的最佳方法是什么?

我的第一个想法是使用存储的函数来执行检查。作为'sa'用户sa执行的函数可以看到所有行。还有其他(更简单的)想法吗?

sql-server row-level-security
1个回答
0
投票

UNIQUE索引是最安全的方法,就像在@Jeroen的评论中所说的那样。

但是,在其他上下文中可能需要禁用行级安全性。如果需要,我的建议是:

  • 为此创建一个'admin'用户(CREATE USER admin WITHOUT LOGIN;

在验证功能中包含逻辑以考虑此用户:

CREATE FUNCTION Security.fn_securitypredicate(@param as VARCHAR(100))  
RETURNS TABLE  
WITH SCHEMABINDING  
AS  
    RETURN SELECT 1 AS Result
    WHERE
        /* Your logic here */ 
        OR
        USER_NAME() = 'admin' ;

这样,当您模仿“admin”用户时,所有记录都可以访问。任何其他用户,您的行级安全逻辑仍然适用。

在运行查询时模拟用户:

EXECUTE AS USER = 'admin';
SELECT * FROM MyTable;
REVERT; -- Returns to the original user context
© www.soinside.com 2019 - 2024. All rights reserved.