本節書摘來自異步社群《php、mysql和apache入門經典(第5版)》一書中的第2章,第2.8節,作者【美】julie c. meloni,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視
php、mysql和apache入門經典(第5版)
mysql權限系統總是起作用的。當你第一次嘗試連接配接mysql伺服器的時候,并且對于每一個後續的動作,mysql都會檢查以下3件事情。
你從哪裡通路(你的主機)?
你說你是誰(你的使用者名和密碼)?
允許你做什麼(你的指令權限)?
所有這些資訊都存儲在一個名為mysql的資料庫中,當安裝mysql的時候,自動建立該資料庫。在mysql資料庫中,有如下幾個和權限相關的表。
columns_priv——為一個表中的具體字段定義使用者權限。
db——為伺服器上的所有資料庫定義許可。
host——定義連接配接到一個具體資料庫的、可接受的主機。
procs_priv——為存儲例程定義使用者權限。
tables_priv——為一個資料庫中的具體的表定義使用者權限。
user——為一個具體使用者定義指令權限。
在本章中,當你向mysql添加一些示例使用者的時候,這些表将變得更為重要。現在,隻需要記住這些表的存在,并且為了讓使用者完成操作,這些表中必須擁有相關的資料。
正如你所了解的,在身份驗證過程中,mysql檢查3件事情。和這3件事情相關的動作分如下兩步執行。
1.mysql檢視你的連接配接所來自的主機,以及所使用的使用者名和密碼。如果主機允許連接配接,你的使用者名對應的密碼正确,并且使用者名和配置設定給該主機的一個使用者名比對,mysql就轉到第二步。
2.對于你嘗試執行的任何一條sql指令,mysql驗證你能夠對該資料庫、表和字段執行此操作。如果步驟1失敗,你将會看到一個相關的錯誤,并且不能繼續步驟2。例如,假設你使用一個使用者名joe和一個密碼abc123連接配接到mysql,并且想要通路一個名為mydb的資料庫。如果由于如下原因導緻這些連接配接變量的任何一個不正确,你都會接收到一條類似如下的錯誤消息。
密碼不正确。
使用者名joe不存在。
使用者joe不能從localhost連接配接。
使用者joe能夠從localhost連接配接,但不能使用mydb資料庫。
你可能看到如下的一條錯誤消息。

如果帶有密碼abc123的使用者joe允許從localhost連接配接到mydb資料庫,mysql将會在這個過程的第二個步驟中檢查joe所能執行的操作。為了便于說明,假設jow允許查詢資料但是不允許插入資料。事件和錯誤的序列就會如下所示。
基于操作的許可在具有多層級管理的應用程式中很常見。例如,如果已經建立了包含個人财務資料的應用程式,你必須確定對記賬級别的成員隻賦予select權限,而對具有安全許可的主管級成員賦予insert和delete權限。
在大多數情況下,當你通過一個internet服務提供商通路mysql的時候,隻有一個使用者和一個資料庫可供使用。預設情況下,一個使用者将能夠通路該資料庫中所有的表,并且允許執行所有的指令。在這種情況下,作為開發者,你的職責就是通過自己的程式設計開發出一個安全的應用程式。
然而,如果你是自己的伺服器的管理者,或者internet服務提供商允許你任意添加多個資料庫和使用者,并且可以修改自己的使用者的通路權限,下面幾個小節将帶你學習如何做到這些。
通過一個第三方應用程式來管理伺服器,這為你提供了一個簡單的方法來添加使用者,隻要使用一個類似向導的過程或一個圖形化界面。然而,通過mysql螢幕添加使用者并不難,尤其是如果你了解了mysql所使用的安全檢查點,這我們剛才已經學習過。
添加新使用者的最簡單的方法就是使用grant指令。作為root使用者連接配接到mysql,我們就可以使用一條指令來建立一個新使用者。另一種方法是使用insert語句修改mysql資料庫中所有相關的表,這需要我們知道用來存儲許可的表的所有字段。第二種方法的效果和grant指令相同,但是比grant指令複雜得多。grant指令的簡單文法如下。
all——授予使用者所有常見權限。
alter——使用者可以改變(修改)表、列和索引。
create——使用者可以建立資料庫和表。
delete——使用者可以從表中删除記錄。
drop——使用者可以删除表和資料庫。
file——使用者可以讀取和寫入檔案,這個權限用來導入或轉儲資料。
index——使用者可以添加或删除索引。
insert——使用者可以向表中添加記錄。
process——使用者可以檢視并停止系統程序,隻有可信任的使用者才能擁有此權限。
reload——使用者可以使用flush語句,隻有可信任的使用者才能擁有此權限。
select——使用者可以從表中選取記錄。
shutdown——使用者可以關閉mysql伺服器,隻有可信任的使用者才能擁有此權限。
update——使用者可以更新(修改)表中的記錄。
例如,如果你想要建立一個帶有99hjc!5密碼的使用者john,他在名為mydb的資料庫中的所有表上都有select和insert權限,并且希望這個使用者能夠從任何主機連接配接,那麼,使用如下指令。
注意兩個通配符和%的使用。這兩個通配符用來代替值。在這個例子中,代替了資料庫的全部表,而%代替了已知的世界中的所有主機的清單,這實際上是非常長的一個清單。
這裡還有使用grant指令添加使用者的另外一個例子。這次是添加一個帶有密碼45sdg11的使用者jane,他在名為mycompany的資料庫的一個名為employees的表上具有all權限。這個新的使用者隻能從一個特定的主機連接配接。
如果你知道janescomputer.company.com有一個ip位址63.124.45.2,可以用這個位址來替代指令中的主機名部分,指令如下所示。
添加使用者的時候需要注意一點:總是使用密碼并且確定這個密碼是不易被破解的。
如果你使用grant指令來添加使用者,改變會立即生效。要絕對確定這一點,你可以在mysql螢幕中使用一條flush privileges指令來重新載入授權表。
移除權限和添權重限一樣簡單,隻不過是使用revoke指令,而不是使用grant指令。revoke指令的文法如下。
我們授權許可來使用insert指令,采用同樣的方式,我們也可以通過使用delete指令從mysql資料庫的表中删除記錄,進而取消前面的授權許可。然而,這需要你熟悉字段和表,并且使用revoke指令會更容易和安全。
要把使用者john向mycompany資料庫中的insert能力收回,可以使用如下一條revoke語句。
對權限表中的資料的修改會立刻生效,但是,為了讓伺服器立刻意識到你的修改,在mysql螢幕中可以使用flush privileges指令。