Sql server ASP.NET MVC/SQL Server中实用的基于角色的数据访问控制
我有一个ASP.NET MVC+SQL Server应用程序,每天有250个同时使用的用户,它使用AD/NTLM SSO来执行所有授权,使用自定义授权安全类来控制对控制器和基于用户和组的操作的访问 最近出现了一个难题,数据库的50K+帐户记录将由不同的组进行不同程度的管理:Sql server ASP.NET MVC/SQL Server中实用的基于角色的数据访问控制,sql-server,asp.net-mvc,security,database-design,data-structures,Sql Server,Asp.net Mvc,Security,Database Design,Data Structures,我有一个ASP.NET MVC+SQL Server应用程序,每天有250个同时使用的用户,它使用AD/NTLM SSO来执行所有授权,使用自定义授权安全类来控制对控制器和基于用户和组的操作的访问 最近出现了一个难题,数据库的50K+帐户记录将由不同的组进行不同程度的管理: 所有用户都可以查看大多数记录,某些记录只能 将由特定部门的特定用户/组编辑 成为能够编辑任何集团所有记录的管理和支持小组成员 等等 这不是谁可以访问控制器中的哪些功能/表单等的问题,而是必须施加的数据所有权限制的难题。我
- 所有用户都可以查看大多数记录,某些记录只能
- 将由特定部门的特定用户/组编辑
- 成为能够编辑任何集团所有记录的管理和支持小组成员
- 等等
owner\u roles
的表,并将其映射到users
表,然后创建另一个名为accounts\u 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
但这样做将创建一个25000行的表,并且很容易得到一些糟糕的性能。看看Facebook和其他网站,这肯定是一个必须实现的常见问题,但我不太愿意引入这样的表,因为它可能会造成严重的性能问题
我认为实现这一点的另一种方法是,在accounts表中添加一个额外的列,该列是一个以逗号分隔的复合字段,将包含具有编码权限集的所有者,即:
id owners
1 ,hr,
2 ,hr,
3 ,hr,it,
4 ,it,
然后使用“like”语句添加要搜索的自定义类。。如果登录用户角色为“it”,并且在所有者名称中保留且不允许使用逗号:
SELECT * FROM accounts WHERE owners LIKE '%,it,%'
。。。然而,从DBA的角度来看,这确实是一个错误(非常丑陋)和一个维护噩梦
关于如何在不破坏我的网站的情况下实现这一点,有什么切实可行的方法吗?首先,您可以跳过纯定义中的角色,但应该能够这样实现:
- 每个用户都可以在一个或多个组中,如管理员、支持、it、hr
- 每个数据行都有一个所有者,如hr
最初概念中的角色允许用户选择他/她想要使用的权限,在您的界面中会有“使用管理员权限解锁”之类的功能。主要是出于性能原因,我采用了下面列出的不太优雅的方法。这需要做一些工作,但必须创建一些谨慎的应用程序控件来强制执行id中没有逗号之类的操作。感谢您的评论,但这并不能真正提供任何实用的建议。正如我在原始帖子中所说,没有押韵或理由说明哪些记录属于哪个组,这使你的建议无效;i、 e.:,人力资源,第一组,it,