根据用户访问级别过滤数据的策略

时间:2009-12-14 17:24:11

标签: sql-server database-design permissions

我们目前有一个非常简单的安全架构...

我们有资源,大致映射到表,我们可以访问这些资源(添加,修改,删除,查询),我们有组。

每个权限由具有指定访问权限和组

的资源组成

每个用户都可以属于多个群组......

因此,权限是组,访问和资源之间的多对多

我们在用户和群组之间也有多对多。

这对我们的需求来说还不错......

我想要的是一种在记录级别使用类似方案授予数据权限的方法。我需要一种根据用户访问级别“过滤”记录的方法。

例如,属于某个组的用户可以看到表(资源)的所有记录,但是来自另一个组的用户只能看到满足特定条件的记录,他们看到过滤的数据...

我正在考虑在权限表中添加“表达式”字段,以便在访问某个资源时应用过滤器(事实上它会稍微复杂一点,我将不得不应用组的每个过滤器用户所属的,用“或”加入

我希望它尽可能通用且可配置......

你会如何处理这样一个用例?

4 个答案:

答案 0 :(得分:1)

我知道你还没有答案 - 我当然不确定你的答案是什么,但这是我对它的价值的看法。

我可能误解了,但如果我试图对角色/组强制执行细粒度的访问控制,我会在应用程序而不是数据存储解决方案中执行此操作。

在这种情况下,我不知道这是否适合您,但如果您在数据层中执行此安全操作,则可能会遇到问题,因为缺乏灵活性甚至供应商锁定你最终使用专有扩展。

对此处的任何支持/冲突观点非常感兴趣。

答案 1 :(得分:1)

您对过滤器使用“表达式”并动态创建SQL语句(对吗?)来过滤数据的想法应该有效。唯一其他真正的替代方案似乎需要一组固定的过滤器“轴”,用户可以在其上定义对记录的访问权限。在两种基本机制之间进行选择需要有关应用程序的更多详细信息作为一个(明显的)例子,在我的雇主的应用程序中,每个客户(记录)被分配到一个“办公室”,我们提供安全机制来控制哪些用户可以访问哪些办公室的客户。这是使用我描述的第二种机制实现的,因为它对我们的应用程序设计至关重要。如果您正在构建更多的“元应用程序”,您可能希望实现更通用的解决方案,以便您可以更轻松地更改此行为。

答案 2 :(得分:1)

我强烈建议您查看一个能够构建动态查询的ORM(对象关系映射)框架。基本的想法是,您将根据登录用户的安全性在应用程序代码中构建标准,并且框架将其转换为在服务器上执行的SQL(因此您不会将所有记录拉入应用程序层并在那里过滤)。这种方法与使用直接动态SQL之间的区别在于,ORM将允许您编写类型安全的代码,其中直接动态SQL是基于字符串的,这使得它容易出现人为错误。

其中一些ORM框架带有开箱即用的授权功能,可能(或可能不)与我上面描述的不同,但也可能完成工作。

我确信LLBLGen Pro具有非常强大的动态查询引擎,并且支持行级授权。我不是NHibernate或Entity Framework的专家,但我确信他们也有这种支持。

即使你不打算将ORM用于持久性(它们的主要目的),也可能值得让它们看看它们的动态查询功能。

答案 3 :(得分:1)

我们有一个AccessControlEntry表,如下所示:

CREATE TABLE [dbo].[AccessControlEntry]
(
    [subjectId] [nvarchar](256) NOT NULL,
    [objectType] [varchar](256) NOT NULL,
    [objectId] [int] NOT NULL,
    [permission] [varchar](50) NOT NULL,
    [flag] [int] NOT NULL DEFAULT (0),
    [applyToChildren] [int] NOT NULL DEFAULT (1),
    CONSTRAINT [PK_AccessControlEntry] PRIMARY KEY CLUSTERED ([subjectId] ASC, [objectType] ASC, [objectId] ASC, [permission] ASC)
)

我们设置权限的用户ID是subjectId,objectType和objectId标识我们正在设置权限的对象(术语中的资源)。在我们的例子中,我们为每个权限(即列表,查看,创建,修改,删除)提供了单独的记录 - 但您可以轻松地为每个权限创建一个列。

然后我们创建了一个表值函数,它接受一个subjectId,objectType和一个objectId,并返回权限。

一旦你拥有了这个,你最终会在几乎所有的查询中显示这个表值函数,因此你可以过滤用户对资源所拥有的权限所返回的内容。

由于我们的数据本质上是分层的(有点像公司中的业务单位),我们的权限系统处理权限和继承的层次结构。我不熟悉您的数据模型,因此我不知道您对此也有要求 - 但这个想法类似于您对目录和文件应用安全权限的方式。