我正在为我的数据库实施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
的内容吗?
答案 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个权限,最后您创建尽可能多的角色,因为它们是用户类型(公共用户,演示,系统管理员,超级用户......),并将它们与您希望他们拥有的权限相关联
就是这样!