MySQL 零基础教程

MySQL 用户权限管理

MySQL 中的访问控制由 GRANTREVOKE 语句管理。这些命令准确地规定了特定用户账户可以对你的数据库对象执行哪些操作,确保用户仅拥有完成其工作所需的最低级别的访问权限——这一原则被称为“最小特权 (least privilege)”。

1. 使用 GRANT 授予权限

GRANT 语句用于为用户账户分配特定的权限。你必须指定作用域(全局、数据库级或表级)并指明用户连接的主机。

基本语法遵循以下结构:

GRANT [privileges] ON [database].[table] TO '[user]'@'[host]';

1.1 细粒度访问控制

你可以提供宽泛的权限或高度受限的权限。例如,要允许应用程序用户仅对 world 数据库执行读取操作,你可以使用:

-- 允许对 'world' 数据库中的所有表进行 SELECT 访问
GRANT SELECT ON world.* TO 'app_user'@'localhost';

如果你需要开发人员能够修改数据但不能删除表,你可以列出用逗号分隔的多个权限:

-- 允许数据操作和表结构修改
GRANT SELECT, INSERT, UPDATE, DELETE, ALTER ON world.* TO 'dev_user'@'localhost';

1.2 管理员权限

有时,一个账户需要对特定数据库拥有完全控制权,包括创建表和管理索引的能力。你可以使用 ALL PRIVILEGES 关键字授予所有标准权限:

-- 对特定数据库的完全控制权
GRANT ALL PRIVILEGES ON world.* TO 'admin_user'@'localhost';

注意: 运行 GRANT 命令后,更改可能不会立即对现有会话生效。你可以使用 FLUSH PRIVILEGES; 来重新加载权限表,尽管对于 DCL(数据控制语言)语句,MySQL 通常会自动处理此操作。

2. 使用 REVOKE 撤销访问权限

REVOKE 语句用于移除先前授予的权限。它与 GRANT 的语法完全对应,但它的作用不是添加访问权限,而是将其剥夺。

如果开发人员不再需要 ALTER 表的权限,你只需移除该特定权限:

REVOKE ALTER ON world.* FROM 'dev_user'@'localhost';

如果你希望在保持用户账户完好无损的情况下移除该用户的所有权限,可以使用 ALL PRIVILEGES

REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_user'@'localhost';

3. 权限层级

MySQL 以层级方式评估权限。当你授予权限时,你就定义了用户触达数据的“广度”。

  • 全局级别 (Global Level): *.*
  • 数据库级别 (Database Level): db.*
  • 表级别 (Table Level): db.table
  • 列级别 (Column Level): db.table.column

详细说明如下:

  • 全局权限: 应用于整个服务器。在此级别授予 GRANT OPTION 允许用户将其权限传递给其他人。
  • 数据库权限: 应用于特定数据库内的每一张表。
  • 表权限: 应用于特定表内的每一列。
  • 列权限: 应用于特定的列(例如,你可以授予用户对 name 列的 SELECT 访问权限,但隐藏 salary 薪水列)。

4. 作用域与安全隐患

在授予访问权限时,请始终明确指定主机。将通配符 % 用于主机(例如,'user'@'%')会允许该用户从任何机器进行连接。这是一个常见的安全漏洞。请务必尽可能将主机限制为特定的 IP 地址或 localhost

要验证用户当前拥有哪些权限,请使用 SHOW GRANTS 命令:

SHOW GRANTS FOR 'dev_user'@'localhost';

这将返回定义用户当前安全状态的精确 SQL 语句,这是审计访问权限最可靠的方法。