2012-03-11 38 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表,它表示用戶和頁面之間的多對多連接。

該表格還可以包含一個屬性,用於定義該頁面的權限級別。

如果您的用戶在很大程度上擁有相同的權限,那麼您可以引入角色的概念 - 訪客,成員,管理員等,並將用戶映射到角色,然後將角色映射到權限。

另外請注意,您應該醃製並散列您的密碼,以防止任何妥協您的應用程序的人獲得有價值的憑據。