[英]Validating users upon login and giving them limited rights to database
我是PHP和MYSQL的新手,試圖創建一個用戶可以用來將數據輸入數據庫的網站。 我正在嘗試做的一個例子是各種銀行的數據庫及其提供的各種服務。例如,Citibank的用戶在我的網站上創建一個帳戶,他將輸入他的LoginID,密碼,電子郵件和名稱他的銀行(在這種情況下將是花旗銀行)。
成功創建帳戶並登錄后,他將成為花旗銀行的“管理員”帳戶,擁有創建,刪除,插入和查看花旗銀行所有數據的權利。 他還可以進一步創建和刪除Outlets,並為該插座創建/刪除SubUser帳戶.Sub用戶帳戶將擁有Admin帳戶所具有的所有權利減去創建更多SubUsers的權利,但僅限於Outlet管理員和子帳戶都將通過網站登錄。
我已經列出了我認為帳戶需要的權利:
Rights to database
SELECT,INSERT,UPDATE,DELETE,(JOIN?)
我目前正在考慮為Admin帳戶實現以下表格:
Admin
+----------+-----------+------------+------------+
| BankID | BankName | UserName | Password |
+----------+-----------+------------+------------+
| 1 | Citibank | CitiAdmin | PassCiti |
| 2 | StanChart | StanAdmin | PassStan |
| 3 | HSBC | HSBCAdmin | PassHSBC |
+----------+-----------+------------+------------+
如果BankID屬於SERIAL類型,而BankName,UserName和Password將由用戶在創建其帳戶時輸入。之所以我不將上表分成2個表,其中一個表包含BankID和BankName以及其他包含用戶名和密碼將是易於使用,因為我覺得拆分它是不必要的,並且過度規范化它。
雖然下表是針對子用戶帳戶的:
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 [User]和$ POST [Pass]獲取userentry並匹配從查詢中提取的數據
$query="SELECT Username AND Password FROM Admin AND SubUsers";
如果匹配,則用戶將登錄。通過這樣做,我能夠實現第一級驗證,其中只有注冊用戶才能訪問數據庫。
但是,我如何限制管理員帳戶和SubUser帳戶的訪問權限。管理員帳戶只能訪問與其銀行相關的數據,而SubUser帳戶只能訪問與其Outlet相關的數據。
我考慮過使用PHP會話來記錄用戶登錄時的數據,方法是更改登錄查詢
$ query =“SELECT用戶名和密碼來自Admin和SubUsers”;
查詢首先從管理員中選擇用戶名和密碼,並通過它運行$ _POST [用戶]和$ _POST [傳遞],如果沒有匹配,它將從SubUser中繪制用戶名和密碼並重復該過程,並且將結果記錄到會話中,具體取決於Admin表或SubUser表中是否發生匹配。
但是,這樣做只會在登錄時改變用戶可用的網頁,而不會改變他們對數據庫本身的實際訪問權限。我能想到使用這種方法的最接近的解決方案是為用戶創建一組全新的網頁,具體取決於無論用戶是Admin還是SubUser,我都不願意這樣做,因為我還不熟悉編程,增加網頁數量只會增加無法顯示的錯誤數量。
是否有任何其他方法來限制用戶訪問數據庫,或其他解決方案來優化我正在嘗試做的事情?
我已經看過如何為多個用戶配置phpMyAdmin - 每個用戶只能訪問他們的數據庫,但它對我來說有點太技術性,似乎在處理用戶訪問數據庫而不是表。
任何建議/幫助/指導將非常感謝。
多么有趣和徹底的問題。 這是一種需要一本書才能徹底回答的類型。 我很佩服你的雄心壯志。
首先要正確設計它。
問問自己用戶可能需要做什么動作並給他們起個名字。 將privelege名稱存儲在表中后,可以根據需要將它們分配給角色或用戶。 您可以通過在每個操作之前檢查是否應用了適當的privelege,或者通過將每個操作寫為包含priveleges身份驗證的函數來驗證在PHP級別執行每個操作的能力。
將bank id和branch id作為Foreign Keys放在每個表中。 這樣,您只需將bankid和branchid包含為WHERE子句的“AND”添加項。 這只需要一個數據庫,但你可以控制誰可以看到使用智能編寫的SQL。
如果您需要用戶能夠在其數據上運行SQL,請確保所有查詢都通過添加必需AND(bankid ='%s'和branchid ='%s')子句的函數運行。 這有效地分離了數據。 如果需要,您可以添加對返回數據的檢查,並考慮使用加密(每個銀行的不同密鑰),盡管這有點遠。
這幾乎就是應用程序層控制的含義。 PHP應用程序根據存儲的priveleges選擇您有權訪問的數據。 我不能重新強調規划你的權益是多么重要,因為他們有意義的名字和冗長的描述。 當你開始時似乎做了很多工作,但它有所作為。 它肯定勝過必須為每個用戶創建一個新的數據庫。 不要擔心填寫SERIAL ID - BIGINT可以處理超過20萬年的每秒百萬次交易。
設計完成后,身份驗證成為下一個障礙。 我認為你應該在你寫任何花哨的東西之前這樣做,因為它真的很難做對。
我會做的是:
收集銀行,分行和用戶名(允許這些在您的HTML中自動完成),然后密碼。 將密碼存儲為SHA1或MD5哈希。 一旦通過身份驗證,您就可以將用戶編號,銀行和分支編號彈出到$ _SESSION中,然后可以在以后輕松檢索SQL。 為了增加安全性,雖然增加了復雜性,但您也可以根據需要從數據庫中選擇這些數字。 有些人建議將它們存儲在單獨的會話表中。
關於如何設計這類項目還有很多話要說,其中大部分內容可以在本網站的其他地方找到,所以我不會贅述。 請隨時詢問是否有任何不清楚的地方。
我希望這有幫助。
編輯:
處理權利。
沒有簡單的方法來處理priveleges。 我為所有頁面使用單個頭文件,自動提取privelege信息:
一種。 識別用戶,通常從$ _SESSION中選擇用戶編號。 灣 從數據庫表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.
你要做的是在roles_priveleges表中輸入一行,將一個角色鏈接到一個privelege。 重復該角色所需的所有權益。 可能很多。 不是問題。
添加用戶后,您可以為其授予角色。 然后,我閱讀roles_priveleges表,並向超級用戶顯示可能的角色列表作為復選框,如果通常會授予privelege,則勾選,否則返回。 超級用戶根據需要從列表中取消選擇或選擇,然后保存列表。
在保存列表時,我將users_priveleges表中該用戶的所有條目標記為非活動狀態,並為每個privelege插入一個新行。 這使您可以跟蹤更改,更重要的是,即使它們未被更改,也可以跟蹤審核的日期。 它最終不會使用太多數據,因為users_priveleges中的每一行都包含三個Bigint,一個bool和兩個日期。
如果您永遠不想授予一個用戶他們的角色通常不會擁有的權限,那么您可以簡單地使用roles_priveleges和users_roles。 這對數據的需求最小,但靈活性卻低得多。
我將承認我所描述的方法有點不優雅,但它提供了非常好的基於角色和用戶的privelege管理,同時保持DB在第4范式或更高。 恕我直言,值得付出額外的努力,因為你的應用程序有一天會更大,現在更容易添加這些東西而不是更晚。 此外,從初學者的角度來看,創建虛擬數據非常容易,並且在您開始執行某些操作之前確保SQL連接正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.