6.2.7 添加帐户,分配权限和删除帐户

要 ManagementMySQL 帐户,请使用用于此目的的 SQL 语句:

帐户 Management 语句使服务器对基础授权 table 进行适当的修改,这在第 6.2.3 节“授权 table”中进行了讨论。

Note

不建议使用INSERTUPDATEDELETE之类的语句直接修改授权 table,风险自负。服务器可以随意忽略由于此类修改而导致格式错误的行。

从 MySQL 5.7.18 开始,对于任何修改授权 table 的操作,服务器都会检查该 table 是否具有预期的结构,如果没有,则会产生错误。必须运行mysql_upgrade才能将 table 更新为预期的结构。

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

本节讨论以下主题:

有关此处讨论的语句的其他信息,请参见第 13.7.1 节“帐户 Management 对帐单”

创建帐户和授予特权

以下示例显示了如何使用mysqlClient 程序来设置新帐户。这些示例假定 MySQL root帐户具有CREATE USER特权以及它授予其他帐户的所有特权。

在命令行上,以 MySQL root用户身份连接到服务器,并在密码提示下提供适当的密码:

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

连接到服务器后,您可以添加新帐户。下面的示例使用CREATE USERGRANT语句设置四个帐户(在其中看到'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'帐户只能在从 localhost 连接时使用。 'finley'@'%.example.com'帐户在主机部分使用'%'通配符,因此可以用于从example.com域中的任何主机进行连接。

如果localhost有一个匿名用户帐户,则'finley'@'localhost'帐户是必需的。如果没有'finley'@'localhost'帐户,则当finley从 localhost 连接而finley被视为匿名用户时,该匿名用户帐户将具有优先权。这样做的原因是,匿名用户帐户比'finley'@'%'帐户具有更具体的Host列值,因此在usertable 排序 Sequences 中排在更早的位置。 (有关usertable 排序的信息,请参阅第 6.2.5 节“访问控制,第 1 阶段:连接验证”。)

  • admin只能将'admin'@'localhost'帐户用于从 localhost 进行连接。它被授予全局RELOADPROCESSManagement 权限。这些特权使admin用户能够执行mysqladmin reloadmysqladmin refreshmysqladmin flush-xxx命令以及mysqladmin processlist。不授予访问任何数据库的特权。您可以使用GRANT语句添加此类特权。

  • 'dummy'@'localhost'帐户没有密码(不安全,不建议使用)。该帐户只能用于从 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数据库的所有数据库级特权。该帐户只能用于从 localhost 连接到服务器。

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

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

检查帐户特权和属性

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

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

要查看帐户的非特权属性,请使用显示创建用户

mysql> SHOW CREATE USER 'admin'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for admin@localhost: CREATE USER 'admin'@'localhost'
IDENTIFIED WITH 'mysql_native_password'
AS '*67ACDEBDAB923990001F0FFB017EB8ED41861105'
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK

撤销帐户特权

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

撤销全局特权:

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

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

撤消数据库级特权:

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

撤消 table 级特权:

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' |
+---------------------------------------------+

Dropping Accounts

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

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