文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  存取控制,階段 2:請求驗證

8.2.7 存取控制,階段 2:請求驗證

在伺服器接受連線之後,它會進入存取控制的階段 2。對於您透過連線發出的每個請求,伺服器會判斷您想要執行的操作,然後檢查您的權限是否足夠。這就是授權表中權限欄發揮作用的地方。這些權限可以來自 userglobal_grantsdbtables_privcolumns_privprocs_priv 表格中的任何一個。(您可能會發現參考第 8.2.3 節,「授權表」很有幫助,其中列出了每個授權表中存在的欄。)

userglobal_grants 表格授予全域權限。這些表格中指定帳戶的列會指出無論預設資料庫為何,全域適用的帳戶權限。例如,如果 user 表格授予您 DELETE 權限,您就可以從伺服器主機上任何資料庫的任何表格中刪除列。明智的做法是只在 user 表格中授予需要權限的人,例如資料庫管理員。對於其他使用者,請將 user 表格中的所有權限保留設定為 'N',並且僅在更特定的層級(針對特定資料庫、表格、欄或常式)授予權限。也可以全域授予資料庫權限,但使用部分撤銷來限制在特定資料庫上執行它們(請參閱第 8.2.12 節,「使用部分撤銷限制權限」)。

db 表格授予資料庫特定的權限。此表格中範圍欄的值可以採用下列形式

  • 空白的 User 值會比對匿名使用者。非空白的值會按字面比對;使用者名稱中沒有萬用字元。

  • HostDb 欄位中可以使用萬用字元 %_。它們的意義與使用 LIKE 運算子進行模式比對操作時相同。如果您想在授與權限時使用這兩個字元本身,則必須使用反斜線跳脫。例如,要將底線字元 (_) 作為資料庫名稱的一部分,請在 GRANT 陳述式中將其指定為 \_

  • '%' 或空白的 Host 值表示 任何主機。

  • '%' 或空白的 Db 值表示 任何資料庫。

伺服器會在讀取 user 表格的同時,將 db 表格讀入記憶體並進行排序。伺服器會根據 HostDbUser 範圍欄位對 db 表格進行排序。如同 user 表格一樣,排序會將最明確的值放在最前面,最不明確的值放在最後面,而且當伺服器尋找符合的列時,它會使用找到的第一個符合項目。

tables_privcolumns_privprocs_priv 表格會授與特定表格、特定欄位和特定常式的權限。這些表格範圍欄位中的值可以採用以下形式:

  • 萬用字元 %_ 可在 Host 欄位中使用。它們的意義與使用 LIKE 運算子進行模式比對操作時相同。

  • '%' 或空白的 Host 值表示 任何主機。

  • DbTable_nameColumn_nameRoutine_name 欄位不能包含萬用字元或空白。

伺服器會根據 HostDbUser 欄位對 tables_privcolumns_privprocs_priv 表格進行排序。這與 db 表格的排序方式相似,但更簡單,因為只有 Host 欄位可以包含萬用字元。

伺服器會使用排序後的表格來驗證接收到的每個請求。對於需要管理權限的請求,例如 SHUTDOWNRELOAD,伺服器只會檢查 userglobal_privilege 表格,因為這些表格是唯一指定管理權限的表格。如果這些表格中帳戶的列允許請求的操作,則伺服器會授與存取權,否則會拒絕存取權。例如,如果您想要執行 mysqladmin shutdown,但您的 user 表格列沒有授與您 SHUTDOWN 權限,則伺服器會拒絕存取權,甚至不會檢查 db 表格。(後者表格不包含 Shutdown_priv 欄位,因此不需要檢查它。)

對於與資料庫相關的請求(INSERTUPDATE 等),伺服器會先檢查使用者在 user 表格列中的全域權限(減去部分撤銷所施加的任何權限限制)。如果該列允許請求的操作,則會授予存取權。如果 user 表格中的全域權限不足,則伺服器會從 db 表格判斷使用者的資料庫特定權限。

  • 伺服器會在 db 表格中尋找 HostDbUser 欄位的相符項目。

  • HostUser 欄位會與連線使用者的主機名稱和 MySQL 使用者名稱比對。

  • Db 欄位會與使用者想要存取的資料庫比對。

  • 如果沒有 HostUser 的列,則會拒絕存取權。

在判斷 db 表格列授予的資料庫特定權限之後,伺服器會將它們新增至 user 表格授予的全域權限。如果結果允許請求的操作,則會授予存取權。否則,伺服器會依序檢查使用者在 tables_privcolumns_priv 表格中的表格和欄位權限,將這些權限新增至使用者的權限,並根據結果允許或拒絕存取權。對於儲存常式操作,伺服器會使用 procs_priv 表格,而不是 tables_privcolumns_priv

用布林術語表示,上述使用者權限的計算方式可以總結如下:

global privileges
OR database privileges
OR table privileges
OR column privileges
OR routine privileges

如果最初發現全域權限不足以執行請求的操作,為什麼伺服器稍後會將這些權限新增至資料庫、表格和欄位權限,這可能不明顯。原因是請求可能需要一種以上的權限類型。例如,如果您執行 INSERT INTO ... SELECT 陳述式,您需要 INSERTSELECT 權限。您的權限可能是 user 表格列授與一個全域權限,而 db 表格列特別授與相關資料庫的另一個權限。在這種情況下,您有執行請求所需的必要權限,但伺服器無法單獨從您的全域或資料庫權限中判斷出來。它必須根據組合權限做出存取控制決策。