HOWTO · MySQL

在 MySQL 中實現重新整理許可權

本教程介紹了 MySQL 中的重新整理許可權命令,用於重新整理授權表並影響允許的更改。

本頁內容

本教程通過示例解釋了重新整理許可權操作及其實現。

在 MySQL 中實現重新整理許可權

MySQL 通過授權表實現使用者管理,以確保伺服器中的安全性和訪問控制。通常,root 使用者直接通過 UPDATE 語句或通過 GRANT 關鍵字間接修改授權表。

但是,直接修改授權表需要重新整理許可權操作或重新啟動/重新載入伺服器以反映更改。

在 MySQL 中,可以使用三個關鍵字呼叫重新整理許可權操作,對於對伺服器執行多個更改更加方便和高效。

  1. FLUSH PRIVILEGES 命令。
  2. mysqladmin flush-privileges 命令。
  3. mysqladmin reload 命令。

MySQL 中的授權表

瞭解 MySQL 授權表可以為重新整理許可權提供更好的上下文。如前所述,grants 表是一個系統表,用於儲存有關 MySQL 伺服器連線中各種使用者及其許可權的資訊。

要檢查授權表中的許可權,請使用 SHOW GRANTS 關鍵字。

-- Showing Grant privileges for the current user
SHOW GRANTS FOR CURRENT_USER();

/* Showing Grant privileges for specific user
SHOW GRANTS FOR [USERNAME]
*/

授權表中列出的許可權描述了使用者可用的限制或許可權。讓我們建立一個名為 test_user 的使用者並在 mysql.user 表中檢視該使用者的許可權。

-- Creating a sample user
CREATE USER 'test_user'@'localhost' IDENTIFIED BY '20202010';
-- checking assigned privileges
SELECT * FROM mysql.user where user='test_user' \G;

在 MySQL 中使用 FLUSH PRIVILEGES 關鍵字提交對伺服器的直接許可權更改

UPDATE 語句與 flushprivilege 命令相結合,授予使用者特權並同時反映更改。

例如,讓我們為伺服器中的所有資料庫授予 test_user 只讀許可權 (SELECT)。

UPDATE mysql.user    		-- Directly modifying the user table
SET Select_priv = 'Y'		-- Granting SELECT privilege for test_user
WHERE user = 'test_user';

SELECT * FROM mysql.user where user='test_user' \G;    -- Viewing changes

輸出:

*************************** 1. row ***************************
                    Host: localhost
                    User: test_user
            	    Select_priv: Y     <- This is the updated permission
             		Insert_priv: N
             		Update_priv: N
             		Delete_priv: N                 (OUTPUT HAS BEEN TRUNCATED)

查詢結果顯示使用者現在對所有資料庫都有 SELECT 許可權。但是,此操作尚未反映在伺服器中。

SHOW GRANTS FOR test_user@localhost;    -- Viewing the grants for the user

輸出:

+-----------------------------------------------+
| Grants for test_user@localhost                |
+-----------------------------------------------+
| GRANT USAGE ON *.* TO `test_user`@`localhost` |
+-----------------------------------------------+
1 row in set (0.00 sec)

現在,讓我們執行重新整理特權操作。

FLUSH PRIVILEGES;    					-- This affects the changes made
SHOW GRANTS FOR test_user@localhost;    -- Viewing the grants for the user, again

輸出:

+------------------------------------------------+
| Grants for test_user@localhost                 |
+------------------------------------------------+
| GRANT SELECT ON *.* TO `test_user`@`localhost` |
+------------------------------------------------+
1 row in set (0.00 sec)

其他重新整理許可權命令也可以採用相同的方法,即 mysqladmin flush-privilegesmysqladmin reload

修改使用者許可權的推薦方法是通過 GRANT 命令,因為更改會自動反映,而無需重新整理許可權操作。

授權表的直接和間接修改之間的區別在這個官方文件中有足夠詳細的說明。

使用 GRANT 關鍵字修改 MySQL 中的使用者許可權

讓我們給 test_user 伺服器上所有資料庫和表的 INSERT 許可權。這一次,我們使用 GRANT ON 命令。

GRANT ON 命令語法如下。

GRANT [privilege(s)] ON [Db_name . table_name] TO user

要指定所有資料庫和表,請使用萬用字元 *.* 代替 [Db_name . table_name]

GRANT INSERT ON *.* TO test_user@localhost;   -- Giving test_user Insert privileges
SHOW GRANTS FOR test_user@localhost;   -- Checking for reflected changes

輸出:

+--------------------------------------------------------+
| Grants for test_user@localhost                         |
+--------------------------------------------------------+
| GRANT SELECT, INSERT ON *.* TO `test_user`@`localhost` |
+--------------------------------------------------------+
1 row in set (0.00 sec)

正如預期的那樣,更改反映了沒有使用 FLUSH PRIVILEGES 命令。