8.2.8 添加账户、分配权限和删除账户
管理 MySQL 账户,使用以下 SQL 语句:
-
CREATE USER
和DROP USER
创建和删除账户。 -
SHOW GRANTS
显示账户权限分配。
账户管理语句会导致服务器对底层授权表进行相应修改,关于授权表的讨论见第8.2.3节,“授权表”。
直接使用语句,如INSERT
、UPDATE
或DELETE
修改授权表,强烈不建议,服务器可能会忽略由于修改而变形的行。
对任何修改授权表的操作,服务器都会检查该表是否具有预期结构,如果不是则产生错误。要更新表到预期结构,请执行 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'
从本地主机连接时将被视为匿名用户。这是因为匿名用户帐户的Host
列值比'finley'@'%'
帐户更具体,因此在user
表排序中排前。关于user
表排序的信息,请参见第8.2.6节,“连接验证,阶段1:连接验证”。 -
‘admin’@‘localhost’账户只能由‘admin’用户从本地主机连接。它被授予全局
RELOAD
和PROCESS
管理权限。这些权限使得‘admin’用户能够执行mysqladmin reload、mysqladmin refresh、mysqladmin 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
域中的任何主机连接到服务器,due to 使用了在帐户名主机部分的*
wildcard 字符。
查看帐户的权限,请使用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';