2012-03-11 39 views
0

我想正常化数据库以保存用户名和密码,以及特定用户有权访问哪些网页。这是我开始为简单起见,但我认为“useraccess”表违反根据2本书我有正常化的首要原则...需要建议正常化用户密码/访问数据库表

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 

然后使用用户名和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 

所有这一切似乎方式复杂得多,它需要的是有一个更好的方法来做到这一点?

+0

什么是序列标识?所有你真正需要的连接是userid和pageid,尽管你可能会考虑一个人为的pk来轻松管理关系。 – tvanfosson 2012-03-11 20:25:36

+0

顺便说一句,我希望你真的要存储一个[盐渍(胡椒粉)散列](http://security.stackexchange.com/questions/3272/password-hashing-add-salt-pepper-or-是足够的),而不是该表中的实际密码。 – steveax 2012-03-11 20:29:12

+0

使用序列标识+用户标识可以获得唯一的行。我正在使用SHA512哈希算法,并为密码添加salting。我没有这么说,因为这是关于sql而不是安全的。 – 2012-03-11 20:33:16

回答

0

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

该表格还可以包含一个属性,用于定义该页面的权限级别。

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

另外请注意,您应该腌制并散列您的密码,以防止任何妥协您的应用程序的人获得有价值的凭据。