我有一个 ASP.NET MVC + SQL Server 应用程序,每天有 250 个并发用户,它使用 AD/NTLM SSO 使用自定义授权安全类来执行所有授权,该安全类基于用户和组控制对控制器和操作的访问。
最近出现了一个难题,数据库的 50K+ 帐户记录将由不同的组在不同程度上进行管理:
- 所有用户都可以查看大部分记录,某些记录只能查看
- 由特定部门的某些用户/组编辑
- 成为能够编辑任何组拥有记录的管理员和支持组
- 等等
这不是谁可以访问哪些功能/表单/等的问题。在控制器中,而是必须施加数据所有权限制的两难境地。我猜这意味着我需要一些额外的安全层来实现行级安全。
我正在寻找一种实用且稳健的方法来解决当前应用程序框架中的数据所有权问题,同时将性能影响降至最低,因为很可能需要对其他更大的数据表施加相同的东西。最初将有大约 5 个所有权组,但在不久的将来会逐渐增加到 25 到 100 个。
可悲的是,没有可以在这里实施的硬性和快速的业务规则。除了记录主键 ID 之外,没有押韵或理由来判断谁拥有什么。
为了尝试修复它,我正在考虑创建一个表owner_roles
并将其映射到users
表,然后创建另一个名为的表accounts_ownership
,如下所示:
tbl(PK),row(PK),owner(PK),view,create,modify,delete
accounts,1,hr,1,1,1,1
accounts,1,it,1,0,0,0
accounts,2,hr,1,1,1,1
accounts,2,it,1,1,1,1
accounts,3,it,1,0,0,0
但是这样做会创建一个 250K 行的表,并且很容易获得一些糟糕的性能。看看像 Facebook 和其他网站这样的网站,这一定是一个必须实施的常见事情,但我不愿意引入这样的表格,因为它可能会产生严重的性能问题。
我认为可以实现的另一种方法是向帐户表中添加一个额外的列,该列是一个以逗号分隔的复合字段,其中包含具有一组编码权限的所有者,即:
id owners
1 ,hr,
2 ,hr,
3 ,hr,it,
4 ,it,
然后添加一个自定义类以使用“like”语句进行搜索。假设登录的用户角色是“it”并且逗号是保留的,并且不允许在所有者名称中使用:
SELECT * FROM accounts WHERE owners LIKE '%,it,%'
...但是,从 DBA 的角度来看,这确实是错误的(丑陋的地狱)和维护的噩梦。
关于如何在不破坏我的网站的情况下实现这一点的任何实用方法?