用户所需的Geoaccess权限 - 生成大量数据

时间:2013-10-09 22:16:13

标签: asp.net database sql-server-2008

我有一个基于网络的应用程序,每个用户都被授予称为“Geoaccess”的权限,该权限由州,城市和分支机构或邮政编码组成。

  1. 国。 目前共有15个州。

  2. 市。 每个州都有大约200多个城市。 200个城市x 15个州= 3000个城市总数

  3. 分行或邮政编码。
    每个城市有分支= 10. 3000个城市×10个分支= 30,000个总分支。
    每个城市的邮政编码= 20。 3000个城市x 25个邮政编码= 75000个邮政总代码。

  4. 规则:
    1.每个用户必须能够访问至少一个分支或一个邮政编码(仅限) 2.用户可以访问所有状态。在这种情况下,它还意味着用户可以访问所有分支或邮政编码。

    问题:
    从逻辑上讲,我可以通过将“分支”或“邮政编码”视为最后一级权限来开始构建我的解决方案。但是看看它会为每个用户生成的数据量,我在这里陷入了深深的困惑。

    例如,如果用户拥有所有州的权限,则意味着我必须为该用户填充75000个邮政编码或30000个分支。

    有人建议我使用“-1”或一些独特的固定值,以防用户需要“所有”状态或城市等。我不确定这个解决方案&我想到可能出现的主要维护问题正朝着这条道路前进。

    我相信这里的一些人已经经历过这种情况。请指教。感谢。

2 个答案:

答案 0 :(得分:0)

您似乎正在应用记录级安全性。

最好的方法是拥有一个安全表(每个表StatesCityBranch 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。

修改

鉴于提问者对数据大小,编程简单性以及维护数据的简易性的担忧:

  1. 此方法旨在最大限度地减少数据开销。当用户被授予(或拒绝)访问整个数据集或数据树的整个子树时,只需要一个许可记录。只有当用户被批准访问分支机构时,每个用户的权限记录数才会变得非常高。

  2. 有一些编码工作涉及将三个表中的相关数据聚合到权限UI中并对数据应用权限,但这不应超出功能范围一个相当称职的程序员来创建 - 或理解,特别是如果正确评论和记录。如果预计应用程序所针对的程序员合理胜任,则可以将权限拆分为每个表的一组单独的权限,但是这可能不太适用于的DBA。

  3. 由于此方法应最大限度地减少与每个用户关联的权限记录的数量,因此维护要比纯粹在最低级别的仅授予权限的结构更容易维护,这将生成数千个权限记录DBA必须维护这种方法,这种方法也更容易出现包含和遗漏错误。我所描述的方法可能只需要每个用户少量的许可记录,而不是数千个。

答案 1 :(得分:0)

吐痰

这个怎么样 -

  • 使用(现有/外部)API来验证给定用户的完整地址(这是“最重要的”部分)
  • 现在你已经“验证”了 - Zip,City,State
  • 回到“角色”,为每个“访问级别”分配一个“角色”
    • e.g。 1为“admin”(州),2为“经理”(市),3为“会员”(Zip)

因此,您不一定要一直压缩/发布代码详细信息/数据库存储。我认为City就是它 - re:它是一个验证地址,所以如果 City 很好(如果那个城市有一个分支),那么zip就是太。