我有一个基于网络的应用程序,每个用户都被授予称为“Geoaccess”的权限,该权限由州,城市和分支机构或邮政编码组成。
国。 目前共有15个州。
市。 每个州都有大约200多个城市。 200个城市x 15个州= 3000个城市总数
分行或邮政编码。
每个城市有分支= 10. 3000个城市×10个分支= 30,000个总分支。
每个城市的邮政编码= 20。 3000个城市x 25个邮政编码= 75000个邮政总代码。
规则:
1.每个用户必须能够访问至少一个分支或一个邮政编码(仅限)
2.用户可以访问所有状态。在这种情况下,它还意味着用户可以访问所有分支或邮政编码。
问题:
从逻辑上讲,我可以通过将“分支”或“邮政编码”视为最后一级权限来开始构建我的解决方案。但是看看它会为每个用户生成的数据量,我在这里陷入了深深的困惑。
例如,如果用户拥有所有州的权限,则意味着我必须为该用户填充75000个邮政编码或30000个分支。
有人建议我使用“-1”或一些独特的固定值,以防用户需要“所有”状态或城市等。我不确定这个解决方案&我想到可能出现的主要维护问题正朝着这条道路前进。
我相信这里的一些人已经经历过这种情况。请指教。感谢。
答案 0 :(得分:0)
您似乎正在应用记录级安全性。
最好的方法是拥有一个安全表(每个表States
,City
,Branch or Post Code
和catch-all权限All
都有自己的ID - 这应该是尽可能小的数值数据类型,但为了清楚起见,我将把它作为文本对待):
UserID TableID RecordID
RecordID
可以为空。
如果输入了单个记录:UserID = @x TableID = 'All' RecordID = Null
,则该用户可以访问所有数据。
如果授予用户访问州的数据UserID = @x TableID = 'States' RecordID = 1
的权限,则该用户可以访问与ID = 1的州相关的所有城市和邮政编码。
如果授予用户访问城市数据的权限:UserID = @x TableID = 'City' RecordID = 1
,则该用户可以访问与ID = 1的城市相关的所有邮政编码。
如果授予用户访问分支或邮政编码数据的权限:UserID = @x TableID = 'Branch or Post Code' RecordID = 1
,则该用户只能访问ID = 1的分支或邮政编码。
如果需要,可以添加一个额外的位字段:Deny
,当等于1时,将拒绝访问该记录。这在类似于此的场景中非常有用:在城市“X”中,用户可以访问除少数邮政编码以外的所有邮政编码,因此您将授予对城市的访问权限并拒绝访问已排除的邮政编码。
当然,如果没有许可记录,则无法访问。
如果你想要一些更简单的东西,你可以在每个地理表上有一个权限表,用户记录可以有一个“所有访问”位字段。
您需要根据权限表中的数据生成可过滤地理表的SQL。
修改强>
鉴于提问者对数据大小,编程简单性以及维护数据的简易性的担忧:
此方法旨在最大限度地减少数据开销。当用户被授予(或拒绝)访问整个数据集或数据树的整个子树时,只需要一个许可记录。只有当用户被批准访问分支机构时,每个用户的权限记录数才会变得非常高。
有一些编码工作涉及将三个表中的相关数据聚合到权限UI中并对数据应用权限,但这不应超出功能范围一个相当称职的程序员来创建 - 或理解,特别是如果正确评论和记录。如果预计应用程序所针对的程序员不合理胜任,则可以将权限拆分为每个表的一组单独的权限,但是这可能不太适用于的DBA。
由于此方法应最大限度地减少与每个用户关联的权限记录的数量,因此维护要比纯粹在最低级别的仅授予权限的结构更容易维护,这将生成数千个权限记录DBA必须维护这种方法,这种方法也更容易出现包含和遗漏错误。我所描述的方法可能只需要每个用户少量的许可记录,而不是数千个。
答案 1 :(得分:0)
吐痰:
这个怎么样 -
因此,您不一定要一直压缩/发布代码详细信息/数据库存储。我认为City就是它 - re:它是一个验证地址,所以如果 City 很好(如果那个城市有一个分支),那么zip就是太。