文档主页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  添加帐户、分配权限和删除帐户

8.2.8 添加帐户、分配权限和删除帐户

要管理 MySQL 帐户,请使用为此目的而设计的 SQL 语句

帐户管理语句会导致服务器对底层授权表进行相应的修改,这些授权表在 第 8.2.3 节,“授权表” 中进行了讨论。

注意

不建议直接使用诸如 INSERTUPDATEDELETE 之类的语句修改授权表,这样做风险自负。服务器可以自由地忽略由于此类修改而变得格式错误的行。

对于修改授权表的任何操作,服务器都会检查该表是否具有预期的结构,如果没有,则会产生错误。要将表更新为预期的结构,请执行 MySQL 升级过程。见 第 3 章,升级 MySQL

创建帐户的另一种方法是使用 GUI 工具 MySQL Workbench。此外,一些第三方程序还提供 MySQL 帐户管理功能。phpMyAdmin 就是这样一个程序。

本节讨论以下主题

有关此处讨论的语句的更多信息,请参阅 第 15.7.1 节,“帐户管理语句”

创建帐户和授予权限

以下示例展示了如何使用 mysql 客户端程序设置新帐户。这些示例假设 MySQL root 帐户具有 CREATE USER 权限以及它授予其他帐户的所有权限。

在命令行中,以 MySQL root 用户身份连接到服务器,在密码提示符处提供相应的密码

$> mysql -u root -p
Enter password: (enter root password here)

连接到服务器后,您可以添加新帐户。以下示例使用 CREATE USER GRANT 语句来设置四个帐户(在您看到 'password' 的地方,请替换相应的密码)

CREATE USER 'finley'@'localhost'
  IDENTIFIED BY 'password';
GRANT ALL
  ON *.*
  TO 'finley'@'localhost'
  WITH GRANT OPTION;

CREATE USER 'finley'@'%.example.com'
  IDENTIFIED BY 'password';
GRANT ALL
  ON *.*
  TO 'finley'@'%.example.com'
  WITH GRANT OPTION;

CREATE USER 'admin'@'localhost'
  IDENTIFIED BY 'password';
GRANT RELOAD,PROCESS
  ON *.*
  TO 'admin'@'localhost';

CREATE USER 'dummy'@'localhost';

通过这些语句创建的帐户具有以下属性

  • 两个帐户的用户名为 finley。两者都是超级用户帐户,拥有执行任何操作的完整全局权限。'finley'@'localhost' 帐户只能在从本地主机连接时使用。'finley'@'%.example.com' 帐户在主机部分使用 '%' 通配符,因此它可以用于从 example.com 域中的任何主机连接。

    如果 localhost 上存在匿名用户帐户,则需要 'finley'@'localhost' 帐户。如果没有 'finley'@'localhost' 帐户,当 finley 从本地主机连接时,匿名用户帐户将优先使用,并且 finley 将被视为匿名用户。原因是匿名用户帐户具有比 'finley'@'%' 帐户更具体的 Host 列值,因此在 user 表排序中更早出现。(有关 user 表排序的信息,请参见 第 8.2.6 节,“访问控制,阶段 1:连接验证”。)

  • 只有 admin 可以使用 'admin'@'localhost' 帐户从本地主机连接。它被授予全局 RELOADPROCESS 管理权限。这些权限允许 admin 用户执行 mysqladmin reloadmysqladmin refreshmysqladmin flush-xxx 命令,以及 mysqladmin processlist 。没有授予访问任何数据库的权限。您可以使用 GRANT 语句添加此类权限。

  • 'dummy'@'localhost' 帐户没有密码(这很危险,不建议使用)。此帐户只能用于从本地主机连接。没有授予权限。假设您使用 GRANT 语句向该帐户授予特定权限。

前面的示例授予了全局级别的权限。下一个示例创建三个帐户并在较低级别授予它们访问权限;也就是说,访问数据库中的特定数据库或对象。每个帐户的用户名都是 custom,但主机名部分不同

CREATE USER 'custom'@'localhost'
  IDENTIFIED BY 'password';
GRANT ALL
  ON bankaccount.*
  TO 'custom'@'localhost';

CREATE USER 'custom'@'host47.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON expenses.*
  TO 'custom'@'host47.example.com';

CREATE USER 'custom'@'%.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON customer.addresses
  TO 'custom'@'%.example.com';

这三个帐户可以按如下方式使用

  • 'custom'@'localhost' 帐户对 bankaccount 数据库具有所有数据库级权限。该帐户只能用于从本地主机连接到服务器。

  • 'custom'@'host47.example.com' 帐户对 expenses 数据库具有特定的数据库级权限。该帐户只能用于从主机 host47.example.com 连接到服务器。

  • 'custom'@'%.example.com' 帐户对 customer 数据库中的 addresses 表具有特定的表级权限,可以从 example.com 域中的任何主机进行访问。由于在帐户名的主机部分中使用了 % 通配符,因此该帐户可以用于从域中的所有机器连接到服务器。

检查帐户权限和属性

要查看帐户的权限,请使用 SHOW GRANTS

mysql> SHOW GRANTS FOR 'admin'@'localhost';
+-----------------------------------------------------+
| Grants for admin@localhost                          |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO `admin`@`localhost` |
+-----------------------------------------------------+

要查看帐户的非权限属性,请使用 SHOW CREATE USER

mysql> SET print_identified_with_as_hex = ON;
mysql> SHOW CREATE USER 'admin'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for admin@localhost: CREATE USER `admin`@`localhost`
IDENTIFIED WITH 'caching_sha2_password'
AS 0x24412430303524301D0E17054E2241362B1419313C3E44326F294133734B30792F436E77764270373039612E32445250786D43594F45354532324B6169794F47457852796E32
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT

启用 print_identified_with_as_hex 系统变量会导致 SHOW CREATE USER 显示包含不可打印字符的哈希值作为十六进制字符串,而不是作为常规字符串文字。

撤销帐户权限

要撤销帐户权限,请使用 REVOKE 语句。权限可以在不同的级别撤销,就像它们可以在不同的级别授予一样。

撤销全局权限

REVOKE ALL
  ON *.*
  FROM 'finley'@'%.example.com';

REVOKE RELOAD
  ON *.*
  FROM 'admin'@'localhost';

撤销数据库级权限

REVOKE CREATE,DROP
  ON expenses.*
  FROM 'custom'@'host47.example.com';

撤销表级权限

REVOKE INSERT,UPDATE,DELETE
  ON customer.addresses
  FROM 'custom'@'%.example.com';

要检查权限撤销的效果,请使用 SHOW GRANTS

mysql> SHOW GRANTS FOR 'admin'@'localhost';
+---------------------------------------------+
| Grants for admin@localhost                  |
+---------------------------------------------+
| GRANT PROCESS ON *.* TO `admin`@`localhost` |
+---------------------------------------------+

删除帐户

要删除帐户,请使用 DROP USER 语句。例如,要删除之前创建的一些帐户

DROP USER 'finley'@'localhost';
DROP USER 'finley'@'%.example.com';
DROP USER 'admin'@'localhost';
DROP USER 'dummy'@'localhost';