2

我正在对我的数据库实施 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吗?

4

1 回答 1

1

我想到了。所以这里是:

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

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

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

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

而已!

于 2017-09-21T07:14:46.000 回答