2009-12-14 117 views
4

我们目前有一个非常简单的安全模式过滤器的数据...策略,根据用户访问级别

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

每个权限由资源,具有指定的访问和一群

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

因此,许可是多到多组之间,接入和资源

,我们也有一个多到许多用户和组之间。

这只是罚款,我们的需要......

什么,我试图想是授予权限的数据,在创纪录的水平,具有类似方案的方法。我需要一种根据用户访问级别“过滤”记录的方法。

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

我在想增加一个“表情”字段权限表,以便访问某个资源应用过滤器(实际上,当那将是一个有点复杂,我将不得不申请组的每个过滤器到该用户所属,加入了与一个“或”)

我想它是作为一般的和可配置尽可能...

你会如何处理这样的情况下使用?

+0

您使用的数据库是? – 2009-12-14 17:34:18

+0

M $的SQL Server ...我们有一个观点来解读的许多一对多一对多的关系,为我们提供了资源和访问列表给定用户... ,我们提出的是动态的每个查询,这就是为什么我在想添加表情... – opensas 2009-12-14 17:36:50

回答

1

我看你已经没有解答 - 我当然不知道的正确答案是什么你,但这里是我的观点为它的价值。

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

我不知道这是在这种情况下,你的一个选择,但如果你做的是,在数据层的安全性,你可能会遇到下一个缺乏弹性,甚至供应商锁定的线路问题如果你最终使用专有扩展。

任何支撑/冲突的观点在这里非常感兴趣。

+0

这听起来很合乎逻辑确实,但我们在大部分经营业务逻辑的分贝水平执行,使用存储过程......我们的SP只接收XML,解析和框架相应的行动,我们的应用程序只是建立这些XML,让数据库验证一切... – opensas 2009-12-14 20:10:06

+1

哇 - 有趣的约束,你到了那里!祝你好运...! – Brabster 2009-12-14 21:46:08

1

您对使用“表达式”过滤器和动态创建的SQL语句(右?)来过滤数据应该工作的想法。唯一的其他真正的选择似乎需要一个固定的一组过滤器的“轴”上可以定义用户访问记录。在两种基本机制之间做出决定需要更多关于应用程序的细节。作为一个(明显),例如,在我的雇主的应用程序的每个客户端(记录)被分配给一个“办公室”,我们提供了控制哪些用户可以访问用户在办公室的安全机制。这是使用我描述的第二种机制实现的,因为它对我们的应用程序设计非常重要。如果你正在构建更多的是“元应用程序”,你可能希望实现一个更通用的解决方案,使您可以更容易地更改此行为。

1

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

一些ORM框架都带有授权功能开箱即用,这可能(或可能不是)比上述我不同,但也可以把工作做好。

我知道肯定LLBLGEN Pro有一个非常强大的动态查询引擎,并支持行级授权。我不是NHibernate或Entity Framework的专家,但我确信他们也有这种支持。

即使你不打算使用的持久性的ORM(其主要用途),它可能仍然是值得给他们看看他们的动态查询功能。

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,对象类型和对象ID识别我们设置上(在资源许可的对象你术语)。在我们的例子中,我们为每个权限(即列表,查看,创建,修改,删除)提供单独的记录 - 但是您可以轻松地为每个权限设置一个列。

然后,我们创建了接受subjectId,的objectType和任选的的ObjectID,并返回权限的表值函数。

一旦你的,你最终与此表值函数显示几乎所有的疑问的,所以你可以过滤什么获取用户对资源的权限返回。

由于我们的数据是(在公司有点像业务部门)层次的性质我们的许可系统处理权限和继承的层次结构。我对你的数据模型并不熟悉,所以我不知道你有这样的要求 - 但这个想法与你如何对目录和文件应用安全权限类似。

+0

看起来像这样会让这个AccessControlEntry在拥有中等数量的用户(1,000,000)时变得非常庞大。如果您有十万个不同的对象,这意味着您的表中可以有10^11个条目。这是巨大的, – 2015-02-17 13:41:44