sql-server - 同一个表上的多个安全谓词 (FILTER|BLOCK)

标签 sql-server tsql sql-server-2016 rbac row-level-security

我正在对我的数据库实现 RBAC-RLS 安全性,但我有一个问题。这是场景:

我有一个函数,它有一个输入参数 @PermissionId,它检查登录的用户是否拥有该权限。数据库中的每个角色都关联了多个权限,每个用户可以拥有多个角色。

假设我有一个表 Products,我希望只有拥有 ReadProducts 权限的用户才能查看表的内容。

CREATE SECURITY POLICY ReadProducts
ADD FILTER PREDICATE HasPermission('ReadProducts') ON Products

没关系,但现在我也有权限 SystemAdministrator 并且他还需要有权限查看 Products 表的内容。

如果我添加另一个策略

CREATE SECURITY POLICY ReadProducts
ADD FILTER PREDICATE HasPermission('SystemAdministrator') ON Products

它会像预期的那样工作吗,或者这两个政策之间是否会发生冲突?

或者其他情况,如果我在第一个策略中添加另一个过滤谓词会怎么样。所以它会像:

CREATE SECURITY POLICY ReadProducts
ADD FILTER PREDICATE HasPermission('ReadProducts') ON Products
ADD FILTER PREDICATE HasPermission('SystemAdmin') ON Products

这会好吗?我的意思是,如果我作为用户拥有这两个权限之一,我是否能够看到 Products 表的内容?

最佳答案

我想通了。所以这里是:

你不能在同一个数据库表上有 2 个安全策略,它不会让你创建第二个。 - 你会得到一个错误。

此外,在同一个安全策略的同一个表上不能有 2 个 FILTER 谓词。 - 你会得到一个错误

解决方法: 使用 1 个过滤器和 3-4 个 block 谓词为数据库中的每个表创建安全策略,如下所示:

CREATE SECURITY POLICY [Log]
ADD FILTER PREDICATE [dbo].[HasSecurityPermission]('ReadLog') ON [dbo].[table],
ADD BLOCK  PREDICATE [dbo].[HasSecurityPermission]('AddLog') ON [dbo].[table] AFTER INSERT,
ADD BLOCK  PREDICATE [dbo].[HasSecurityPermission]('EditLog') ON [dbo].[table] BEFORE UPDATE,
ADD BLOCK  PREDICATE [dbo].[HasSecurityPermission]('RemoveLog') ON [dbo].[table] BEFORE DELETE

所以你需要为每个数据库表提供 4 个权限,最后你创建与用户类型(公共(public)用户、演示、系统管理员、 super 用户......)一样多的角色,并将它们与你希望他们拥有的权限相关联.

就是这样!

关于sql-server - 同一个表上的多个安全谓词 (FILTER|BLOCK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46324385/

相关文章:

sql-server - SQLServer 复制能否仅限于数据库中的一组特定表?

sql - 按天均匀分布行

sql-server - TFS 2015 和 SQL Server 2016 兼容性

SQL REPLACE 函数,如何替换单个字母

ASP.net 服务访问数据库

sql-server - SQL Server 中如何检查数据库是否存在?

sql-server - SQL 无法选择带有特殊字符的行

sql - SQL Server 2016中的String_agg

sql-server - SQL Server : preserve calculated fields with a SELECT INTO

c# - 如何使用 Entity Framework Core 配置其他用户定义的数据类型?