【问题标题】:need advice normalizing userpassword/access database tables需要建议规范化用户密码/访问数据库表
【发布时间】:2012-03-28 08:22:47
【问题描述】:

我正在尝试规范化数据库以保存用户名和密码,以及特定用户可以访问的网页。为了简单起见,这是我开始的,但我认为根据我拥有的 2 本书,“useraccess”表违反了规范化的第一条规则......

userpassword table(userid,username,userpassword)
useraccess table(userid, accesstopage0,accesstopage1,accesstopage2,accesstopage3)

显然 useraccess 表有失控的危险。我的问题是......解决这个问题的最佳方法是什么?到目前为止,这就是我想出的替换 useraccess 表的方法,但我想知道是否有更优雅的方法可以做到这一点:

useraccess(userid,useridsequence,pageid)
pages(pageid,pagename)

所以一个例子是......

userpassword table(userid,username,userpassword)
0, useralpha, jinx
1, userbravo, binx
2, usercharlie, jabber

然后使用 userid 和 useridsequence 作为复合键来保持完整性...

useraccess table(userid, useridsequence, pageid)
0, 0, 0
0, 1, 1
0, 2, 2
1, 0, 3
2, 0, 1
2, 1, 2

pages table(pageid,pagename)
0, page0.php
1, page1.php
2, page2.php
3, page3.php

所有这些似乎都比它需要的复杂得多,有没有更好的方法来做到这一点?

【问题讨论】:

  • 序列号有什么用?加入真正需要的只是用户 ID 和页面 ID,但您可能会考虑使用人工 pk 来轻松管理关系。
  • 顺便说一句,我希望您真的要在该表中存储 salted (and peppered) hash 而不是实际密码。
  • 使用序列 id+userid 可以获得唯一的行。我正在使用 SHA512 哈希算法和加盐密码。我没有这么说是因为这更多的是关于 sql 而不是安全性。
  • 您从用户 ID/页面 ID 的唯一性约束中得到相同的结果。实际上,在此表中的这两列上建立唯一索引是一个非常好的主意。

标签: sql normalization


【解决方案1】:

您需要一个用户权限表,它代表用户和页面之间的多对多连接。

该表还可以包含定义该页面权限级别的属性。

如果您的用户在很大程度上具有相同的权限,那么您可以引入角色的概念 - 访客、成员、管理员等,并将用户映射到角色,然后将角色映射到权限。

另外请注意,您应该对密码进行加盐和散列处理,以防止任何破坏您的应用程序的人获得有价值的凭据。

【讨论】:

    猜你喜欢
    • 2011-01-31
    • 2011-01-11
    • 2023-03-25
    • 2010-12-16
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多