2013-05-26 26 views
4

我新的PHP和MYSQL,試圖建立一個網站,用戶可以用它來輸入數據到數據庫中。什麼我想要做的將是各銀行和他們provide.For例如各種服務的數據庫爲例,從花旗銀行用戶創建我的網站上的賬戶,他將進入他的登錄ID,密碼,電子郵件&名稱他的銀行(在這種情況下將是花旗銀行)。驗證後登錄用戶,並給他們有限的權利,以數據庫

成功創建賬戶並登錄後,他將成爲花旗銀行的「管理員」賬戶,擁有創建,刪除,插入&查看來自花旗銀行的所有數據。他還能夠進一步創建&刪除插座,並創建/刪除該插座的SubUser帳戶。SubUser帳戶將擁有管理員帳戶擁有的所有權利減去創建更多SubUsers的權利,但限制爲只有Outlet負責。管理員和子賬戶都將通過網站登錄。

我列出了下來,我覺得賬戶將所需的權限:

Rights to database 
SELECT,INSERT,UPDATE,DELETE,(JOIN?) 

我目前思考下表執行管理員帳戶的:

Admin 
+----------+-----------+------------+------------+ 
| BankID | BankName | UserName | Password | 
+----------+-----------+------------+------------+ 
| 1  | Citibank | CitiAdmin | PassCiti | 
| 2  | StanChart | StanAdmin | PassStan | 
| 3  | HSBC  | HSBCAdmin | PassHSBC | 
+----------+-----------+------------+------------+ 

凡BankID將型系列,而BANKNAME,用戶名和密碼會被用戶在創建他的account.The我之所以不包含BankID和BANKNAME,另一個包含用戶名一個上表分割成兩個表進入&密碼將是易於使用的,因爲我覺得分裂它是不必要的,並且過分正常化它。

雖然下表是對Subuser帳戶:

SubUsers 
+------+------------+--------------+-------------+ 
| ID | OutletID | Name  | Password | 
+------+------------+--------------+-------------+ 
| 1 | 1   | CitiSub1 | PassSub1 | 
| 2 | 1   | CitiSub2 | PassSub2 | 
| 3 | 2   | StanSub1 | PassSub1 | 
| 4 | 2   | StanSub2 | PassSub2 | 
| 5 | 3   | HSBCSub1 | PassSub1 | 
| 6 | 4   | HSBCSub2 | PassSub2 | 
+------+------------+--------------+-------------+ 

通過這樣做,當用戶登錄時,我會得到$ _POST [用戶]和$ POST [通]和匹配,如果userentry對從查詢

$query="SELECT Username AND Password FROM Admin AND SubUsers"; 

,如果有匹配,用戶將登錄in.By這樣做,我能夠實現驗證的第一級只有註冊用戶都能夠訪問得出的數據數據庫。

但是,我將如何限制對管理員帳戶和SubUser帳戶的訪問。管理員帳戶將只能訪問與他的銀行有關的數據,並且SubUser帳戶將只能訪問與他有關的數據出口。

我使用PHP會議認爲或許大概通過改變從

$查詢登錄查詢=「選擇用戶名和密碼admin和SubUsers」登錄時用戶記錄數據;

查詢首先從Admin中選擇用戶名和密碼,並通過它運行$ _POST [User]和$ _POST [Pass],如果沒有匹配,它將從SubUser中繪製用戶名和密碼,然後重複進程,並將結果記錄到會話中,具體取決於Admin表或SubUser表中是否發生匹配。

但是,這樣做只會改變提供給在登錄用戶的網頁,而不是他們的實際訪問數據庫本身。我能想到的使用這種方法的最接近的解決方案是爲用戶創建一組全新的網頁,具體取決於用戶是Admin還是SubUser,我寧願不這樣做,因爲我仍然是編程新手,並且越來越多網頁數量只會增加將不可避免地出現的錯誤數量。

是否有任何其他方法限制用戶訪問數據庫,或其他解決方案來優化我想要做的事情?

我看過How to configure phpMyAdmin for multiple users - each with access to their database only,但對我來說有點太技術了,似乎是在處理用戶對數據庫而不是表格的訪問。

任何意見/幫助/指導將非常感激。

+4

您只需提供MySQL的託管爲您的客戶,這樣,他們將直接連接自己的應用程序到你的MySQL服務器,或者是你的客戶*你*應用程序,它反過來又是連接到你的MySQL服務器的唯一接口?我懷疑後者,但如果是這種情況,那麼你的客戶不應該能夠指定他們自己的SQL,並且你可以在應用層實現你的訪問控制。 – eggyal

+0

@eggyal客戶正在與我的應用程序進行交互,然後該應用程序將連接到我的MYSQL服務器。我假設「應用程序」是指用戶將登錄到的網站。我可以舉一些關於如何在應用程序層實現訪問控制的例子嗎?還有,您的客戶指定他們自己的SQL是什麼意思?如果它有助於澄清事情,他們將登錄的網站將只包含表單,他們將使用這些表單將數據輸入到我的數據庫中。 –

+0

對,所以通過「*在應用層實現訪問控制*」我的意思是你的網站將識別用戶是誰,只發出影響其記錄的數據庫命令。 – eggyal

回答

0

多麼有趣和徹底的問題。它不是那種需要一本書才能徹底回答的類型。我很佩服你的野心。

首先正確設計它。

  1. 問問自己,用戶可能需要做什麼操作併爲其命名。將表格名稱存儲在表格中後,可以根據需要將它們分配給角色或用戶。您可以通過在每個操作之前檢查相應的特權是否被應用,或者通過將每個操作編寫爲包含特權驗證的函數來驗證在PHP級別完成每件事的能力。

  2. 將銀行ID和分支ID作爲外鍵存入每個表中。這樣,您只需將bankid和branchid作爲'AND'添加到WHERE子句中即可。這隻需要一個數據庫,但是您可以控制誰可以看到使用智能寫入的SQL的內容。

  3. 如果您需要用戶能夠在其數據上運行SQL,請確保所有查詢均通過添加必需的AND(bankid ='%s'AND branchid ='%s')子句的函數來運行。這有效地分離了數據。如果需要,您可以添加對返回數據的檢查,也可以考慮使用加密(每個銀行都使用不同的密鑰),雖然這有點遠。

這幾乎就是應用層控制的含義。 PHP應用程序根據存儲的特​​權選擇您有權訪問的數據。我不能重新強調規劃你的特權是多麼重要,因爲他們有意義的名字和詳細的描述。當你開始的時候,似乎有很多工作,但它卻有所不同。它肯定會爲每個用戶創建一個新的數據庫。不要擔心填寫您的SERIAL ID - BIGINT每秒可以處理超過200,000年的每秒100萬筆交易。

一旦設計好,認證就成爲下一個障礙。我認爲你應該在寫出任何內容之前這麼做,因爲這很難讓人理解。

我會做的是:

收集銀行,分支機構和用戶名(讓這些在你的HTML自動完成),然後密碼。 將密碼存儲爲SHA1或MD5散列。 一旦通過身份驗證,您就可以將用戶號碼,銀行和分行號碼彈出到$ _SESSION中,稍後可以輕鬆地爲SQL檢索它們。 爲了增加安全性,雖然增加了複雜性,但您也可以根據需要從數據庫中選擇這些數字。有些人建議將它們存儲在單獨的會話表中。

有這麼多談談如何設計這種項目,其中大部分可以在這個網站在其他地方找到,所以我不會再侈談上。請隨時詢問是否有任何不清楚的地方。

我希望這會有所幫助。

編輯:

處理priveleges。

有沒有簡單的方法來處理priveleges。我用我所有的頁面的單個頭文件自動提取privelege信息:

一個。識別用戶,通常從$ _SESSION中選擇用戶編號。 b。從數據庫表users_priveleges中識別用戶的特權。 c。創建一個包含privelege名稱的數組。 d。對於通過數組中的每一個數據進行比較,只要需要一個需要privelege的操作。

這種方法需要大量的表和也許是位高級您的需求,但如果你有如下表(這裏只提供骨架詳細說明)它是非常無限擴展:

roles (role_id,rolename,role_detailed_description) 
priveleges (privelege_id,privelegename,privelege_detailed_description) 
users (user_id,user_details) 
users_roles (user_id,role_id) (optional but a good idea) 
users_priveleges (user_id,privelege_id) - priveleges granted to each user 
roles_priveleges (role_id,privelege_id) - the priveleges each role has. 

什麼你do在roles_priveleges表中將角色鏈接到privelege中輸入一行。重複該角色所需的所有準則。可能很多。不是問題。

添加用戶時,您授予他們一個角色。然後,我閱讀roles_priveleges表,並向超級用戶顯示可能的角色列表作爲複選框,如果通常將授予privelege,則會打勾。超級用戶根據需要從列表中選擇或選擇,然後保存列表。
保存列表時,我將users_priveleges表中該用戶的所有條目標記爲不活動,併爲每個privelege插入一個新行。這使您可以跟蹤這些變化,重要的是,即使他們沒有改變,審查專家的日期。由於users_priveleges中的每行都包含三個Bigint,一個bool和兩個日期,因此它不會使用大量數據。

如果您不想授予一個用戶privelege他們的角色通常不會posess那麼你可以簡單地使用roles_priveleges和users_roles。這種方式對數據量的要求極低,但靈活性明顯不足。

我承認我所描述的方法有點不雅,但它提供了很好的作用,並根據基於用戶privelege管理,同時保持DB的第四範式或更高。恕我直言,這是值得的額外的一英里,因爲你的應用程序將有一天會更大,這是更容易現在添加這些東西,而不是以後。另外,從初學者的角度來看,創建虛擬數據非常容易,並且確保您的SQL連接在您開始有點困難之前正在工作。

+0

感謝您的詳細回覆羅伯特,我目前爲我的登錄身份驗證做的是首先獲取用戶名,並通過數據庫中所有「管理員」用戶的列表運行,如果有匹配,它將匹配輸入的密碼與存儲在數據庫中的密碼相對應。然後,我將存儲用戶名和用戶的類型值,該值用$ _SESSION表示當前登錄用戶的類型。然後,用戶將被導向不同的Web集取決於用戶類型。 –

+0

我現在面臨的問題是關於密碼加密。從我可以從谷歌搜索,像SHA1,SHA2和MD5哈希都是一個單向過程,沒有方法獲得原始字符串後,一旦它已被哈希。如果是這樣,假設用戶忘記了密碼並請求回密碼,那麼如果我無法對加密的字符串進行解密,我如何能夠檢索密碼並將其發送給他? –

+0

通過哈希算法,您不會將密碼返回給用戶。散列的重點在於數據可以共同映射但不能被檢索,所以如果數據庫被黑了,你不會丟失你的密碼。沒有人可以閱讀它們,甚至沒有你,這給了用戶的安全。只需通過電子郵件發送一個隨機字符串作爲替換密碼。我通常要麼讓密碼太難以記住鼓勵改變密碼或要求用戶選擇新的密碼。 –

相關問題