Documentation Home

6.2.3 授权表

系统mysql数据库包括几个授权表,其中包含有关用户帐户及其拥有的权限的信息。本节介绍这些表。有关系统数据库中其他表的信息,请参阅 第 5.3 节,“mysql 系统数据库”

此处的讨论描述了授权表的底层结构以及服务器在与客户端交互时如何使用它们的内容。但是,通常您不会直接修改授权表。当您使用帐户管理语句(例如 、 和 )来设置帐户并控制每个帐户的可用权限时,会间接CREATE USER发生GRANT修改 REVOKE。参见 第 13.7.1 节,“账户管理声明”。当您使用此类语句执行帐户操作时,服务器会代表您修改授权表。

笔记

INSERT不鼓励使用、 UPDATE或 等语句直接修改授权表 ,DELETE这样做的风险由您自行承担。服务器可以自由地忽略由于此类修改而变得畸形的行。

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

授权表概述

这些mysql数据库表包含授权信息:

每个授权表都包含范围列和权限列:

  • 范围列确定表中每一行的范围;即,该行适用的上下文。例如,user表行的 Host值为User并且'h1.example.net'适用 'bob'于验证 h1.example.net指定用户名为 的客户端从主机到服务器的连接bob。类似地, db表行的 HostUserDb列值为 'h1.example.net''bob'并且'reports'bob从主机连接 h1.example.net以访问 reports数据库时应用。这 tables_privcolumns_priv表包含范围列,指示每行适用的表或表/列组合。procs_priv范围列指示每行适用的存储例程 。

  • 特权列表示表行授予哪些特权;也就是说,它允许执行哪些操作。服务器将各种授权表中的信息组合起来,形成对用户权限的完整描述。第 6.2.6 节,“访问控制,第 2 阶段:请求验证”,描述了这方面的规则。

此外,授权表可能包含用于范围或权限评估以外目的的列。

服务器以下列方式使用授权表:

  • user范围列确定是拒绝还是允许传入连接。对于允许的连接,表中授予的任何权限都 user表示用户的全局权限。此表中授予的任何权限适用于 服务器上的所有数据库。

    警告

    因为全局权限被认为是所有数据库的权限,所以任何全局权限都使用户能够 通过检查表SHOW DATABASES或通过检查INFORMATION_SCHEMA SCHEMATA表来查看所有数据库名称。

  • db范围列确定哪些用户可以从哪些主机访问哪些数据库。特权列确定允许的操作。在数据库级别授予的权限适用于数据库和数据库中的所有对象,例如表和存储程序。

  • 和表类似于 表tables_priv, 但更细粒度:它们适用于表和列级别,而不是数据库级别。在表级别授予的特权适用于表及其所有列。在列级别授予的权限仅适用于特定列。 columns_privdb

  • procs_priv表适用于存储例程(存储过程和函数)。在例程级别授予的特权仅适用于单个过程或函数。

  • proxies_priv表指示哪些用户可以充当其他用户的代理,以及用户是否可以将PROXY权限授予其他用户。

服务器在启动时将授权表的内容读入内存。您可以通过发出FLUSH PRIVILEGES语句或执行mysqladmin flush-privilegesmysqladmin reload命令告诉它重新加载表。授权表的更改生效,如 第 6.2.8 节“特权更改何时生效”中所述。

修改帐户时,最好验证您的更改是否具有预期效果。要检查给定帐户的权限,请使用该SHOW GRANTS语句。例如,要确定授予用户名和主机名值为bob和 的帐户的权限pc84.example.com,请使用以下语句:

SHOW GRANTS FOR 'bob'@'pc84.example.com';

用户和数据库授权表

服务器 在访问控制的第一阶段和第二阶段都使用数据库中的userdb表(请参阅第 6.2 节,“访问控制和帐户管理”)。和表中的列 显示在此处。 mysqluserdb

表 6.3 user 和 db 表列

表名 user db
范围列 Host Host
User Db
Password User
特权专栏 Select_priv Select_priv
Insert_priv Insert_priv
Update_priv Update_priv
Delete_priv Delete_priv
Index_priv Index_priv
Alter_priv Alter_priv
Create_priv Create_priv
Drop_priv Drop_priv
Grant_priv Grant_priv
Create_view_priv Create_view_priv
Show_view_priv Show_view_priv
Create_routine_priv Create_routine_priv
Alter_routine_priv Alter_routine_priv
Execute_priv Execute_priv
Trigger_priv Trigger_priv
Event_priv Event_priv
Create_tmp_table_priv Create_tmp_table_priv
Lock_tables_priv Lock_tables_priv
References_priv References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
Show_db_priv
Super_priv
Repl_slave_priv
Repl_client_priv
Create_user_priv
Create_tablespace_priv
安全栏目 ssl_type
ssl_cipher
x509_issuer
x509_subject
plugin
authentication_string
password_expired
资源控制栏 max_questions
max_updates
max_connections
max_user_connections

表、 和 user列存储身份验证插件和凭据信息。 pluginPasswordauthentication_string

如果帐户行在列中命名了一个插件 plugin,则服务器将使用它来验证该帐户的连接尝试。是否使用Passwordauthentication_string列值取决于插件。

如果plugin帐户行的列为空,则服务器会根据列中密码哈希的格式,隐式地使用 mysql_native_passwordmysql_old_password插件 对帐户进行身份验证Password。如果该 Password值为空或 4.1 密码哈希(41 个字符),则服务器使用 mysql_native_password. 如果密码值是 pre-4.1 密码哈希(16 个字符),则服务器使用 mysql_old_password. (有关这些哈希格式的其他信息,请参阅 第 6.1.2.4 节,“MySQL 中的密码哈希”。)客户端必须与Password帐户行列中的密码相匹配。

password_expired列允许 DBA 使帐户密码过期并要求用户重置其密码。默认password_expired值为'N',但可以 'Y'使用ALTER USER语句设置为。帐户密码过期后,该帐户在后续与服务器的连接中执行的所有操作都会导致错误,直到用户发出SET PASSWORD建立新帐户密码的语句。

笔记

虽然可以通过将过期的密码设置为当前值来重置该密码,但作为一种好的策略,最好选择一个不同的密码。

tables_priv 和 columns_priv 授权表

在访问控制的第二阶段,服务器执行请求验证以确保每个客户端对其发出的每个请求都有足够的权限。除了 授权表,服务器还可以查询user涉及表的请求的表 。后面的表在表和列级别提供更精细的权限控制。它们具有下表中显示的列。 dbtables_privcolumns_priv

表 6.4 tables_priv 和 columns_priv 表列

表名 tables_priv columns_priv
范围列 Host Host
Db Db
User User
Table_name Table_name
Column_name
特权专栏 Table_priv Column_priv
Column_priv
其他专栏 Timestamp Timestamp
Grantor

和 列分别设置为当前时间戳和 Timestamp值,但在其他方面未使用。 GrantorCURRENT_USER

procs_priv 授权表

为了验证涉及存储例程的请求,服务器可以查询procs_priv表,该表具有下表中显示的列。

表 6.5 procs_priv 表列

表名 procs_priv
范围列 Host
Db
User
Routine_name
Routine_type
特权专栏 Proc_priv
其他专栏 Timestamp
Grantor

Routine_type列是一 ENUM列,其值为 'FUNCTION''PROCEDURE' 以指示该行引用的例程类型。此列允许为具有相同名称的函数和过程分别授予权限。

TimestampGrantor 未使用。

proxies_priv 授权表

proxies_priv表记录了有关代理帐户的信息。它有这些列:

  • Host, User: 代理账户;也就是说,具有 PROXY代理帐户权限的帐户。

  • Proxied_host, Proxied_user: 代理帐户。

  • Grantor, Timestamp: 未使用。

  • With_grant:代理账号是否可以授权PROXY给其他账号。

对于能够将 PROXY权限授予其他帐户的帐户,它必须在 proxies_priv表中 有一行With_grant设置为 1, Proxied_host并且 Proxied_user设置为指示可以授予权限的一个或多个帐户。例如,'root'@'localhost'在安装 MySQL 时创建的帐户在 proxies_priv表中有一行可以授予 PROXY权限 ''@'',即所有用户和所有主机。这可以root设置代理用户,以及将设置代理用户的权限委托给其他帐户。请参阅第 6.2.12 节,“代理用户”

授予表范围列属性

授权表中的范围列包含字符串。每个的默认值为空字符串。下表显示了每列中允许的字符数。

表 6.6 授权表范围列长度

列名 最大允许字符数
Host,Proxied_host 60
User,Proxied_user 16
Password 41
Db 64
Table_name 64
Column_name 64
Routine_name 64

HostProxied_host 值在存储在授权表之前被转换为小写。

出于访问检查目的,比较 UserProxied_userPasswordDbTable_name值区分大小写。HostProxied_hostColumn_name和值的比较Routine_name不区分大小写。

授予表权限列属性

user和表 在db声明为 的单独列中列出每个权限 ENUM('N','Y') DEFAULT 'N'。换句话说,每个权限都可以禁用或启用,默认情况下是禁用的。

tables_priv和 表将特权列声明为columns_priv列 。这些列中的值可以包含表控制的权限的任意组合。仅启用列值中列出的那些权限。 procs_privSET

表 6.7 集合类型权限列值

表名 列名 可能的集合元素
tables_priv Table_priv 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter', 'Create View', 'Show view', 'Trigger'
tables_priv Column_priv 'Select', 'Insert', 'Update', 'References'
columns_priv Column_priv 'Select', 'Insert', 'Update', 'References'
procs_priv Proc_priv 'Execute', 'Alter Routine', 'Grant'

只有该user表指定了管理权限,例如RELOADSHUTDOWN。管理操作是对服务器本身的操作,而不是特定于数据库的,因此没有理由在其他授权表中列出这些权限。因此,服务器只需查询该user表即可确定用户是否可以执行管理操作。

FILE权限也仅在user表中指定。它本身不是管理特权,但用户在服务器主机上读取或写入文件的能力与所访问的数据库无关。