同一个 Table 上的多个安全谓词 (FILTER|BLOCK)

Multiple Security Predicates (FILTER|BLOCK) on same Table

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

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

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

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

没关系,但现在我也有权限 SystemAdministrator 并且他需要也有权限才能查看 Products table.

的内容

如果我添加另一个策略

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

这样可以吗?我的意思是,如果我作为用户拥有这两个权限之一,我将能够看到 table Products?

的内容

我明白了。所以这里是:

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

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

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

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 个权限 table,最后您创建与用户类型一样多的角色(public 用户、演示、系统管理员、超级用户...)并将它们与您希望它们拥有的权限相关联。

就是这样!