同一个表

时间:2017-09-20 14:10:24

标签: 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的内容吗?

1 个答案:

答案 0 :(得分: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个权限,最后您创建尽可能多的角色,因为它们是用户类型(公共用户,演示,系统管理员,超级用户......),并将它们与您希望他们拥有的权限相关联

就是这样!