在 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
SHOWGRANTSFORCURRENT_USER();/* Showing Grant privileges for specific user
SHOW GRANTS FOR [USERNAME]
*/

授权表中列出的权限描述了用户可用的限制或权限。让我们创建一个名为 test_user 的用户并在 mysql.user 表中查看该用户的权限。

-- Creating a sample user
CREATEUSER'test_user'@'localhost'IDENTIFIEDBY'20202010';-- checking assigned privileges
SELECT*FROMmysql.userwhereuser='test_user'\G;

在 MySQL 中使用 FLUSH PRIVILEGES 关键字提交对服务器的直接权限更改

UPDATE 语句与 flushprivilege 命令相结合,授予用户特权并同时反映更改。

例如,让我们为服务器中的所有数据库授予 test_user 只读权限 (SELECT)。

UPDATEmysql.user-- Directly modifying the user table
SETSelect_priv='Y'-- Granting SELECT privilege for test_user
WHEREuser='test_user';SELECT*FROMmysql.userwhereuser='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 权限。但是,此操作尚未反映在服务器中。

SHOWGRANTSFORtest_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)

现在,让我们执行刷新特权操作。

FLUSHPRIVILEGES;-- This affects the changes made
SHOWGRANTSFORtest_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]TOuser

要指定所有数据库和表,请使用通配符 *.* 代替 [Db_name . table_name]

GRANTINSERTON*.*TOtest_user@localhost;-- Giving test_user Insert privileges
SHOWGRANTSFORtest_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 命令。