Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  ...  /  Access Control, Stage 2: Request Verification

8.2.7 访问控制,第二阶段:请求验证

服务器接受连接后,它将进入 Stage 2 的访问控制阶段。对于每个通过连接发送的请求,服务器将确定您想要执行的操作,然后检查您的权限是否足够。这是权限列在授权表中的地方。这些权限可以来自任何userglobal_grantsdbtables_privcolumns_privprocs_priv表中。您可能会发现,查看第8.2.3节,“授权表”,该表列出了每个授权表中的列,可以帮助您。

userglobal_grants表授予全局权限。这些表中关于给定帐户的行表示该帐户在全局范围内的权限,无论默认数据库是什么。例如,如果user表授予您DELETE权限,您可以删除任何数据库中的任何表的任何行。为避免授予不必要的权限,建议只授予数据库管理员需要的权限。对于其他用户,留下user表中的所有权限设置为'N',并在更具体的级别上授予权限(例如,特定的数据库、表、列或存储程序)。还可以授予数据库权限,但使用部分撤销来限制它们在特定的数据库中执行(查看第8.2.12节,“部分撤销使用的权限限制”)。

db表授予数据库特定的权限。该表中的scope列的值可以采用以下形式:

  • 一个空的User值匹配匿名用户。一个非空值匹配字面上;没有通配符在用户名中。

  • HostDb列中,可以使用通配符%_。这些字符的含义与使用LIKE操作符进行模式匹配操作时相同。如果您想在授予权时使用这些字符,必须使用反斜杠将其转义。例如,要将下划线字符(_)作为数据库名称的一部分,指定它为\_GRANT语句中。

  • 一个'%'或空的Host值表示“任何主机。”

  • 一个'%'或空的Db值表示“任何数据库。”

服务器将 db 表加载到内存中,并在读取 user 表时同时对其进行排序。服务器根据 HostDbUser 范围列对 db 表进行排序。与 user 表相同,排序将最具体的值排在前,最后是最不具体的值,当服务器查找匹配行时,它将首先找到第一个匹配项。

tables_privcolumns_privprocs_priv 表授予表特定的、列特定的和存储程序特定的权限。这些表的范围列中的值可以采用以下形式:

  • Host 列中,可以使用通配符字符 %_。这些字符的含义与使用 LIKE 运算符执行模式匹配操作时相同。

  • 一个 '%' 或空 Host 值表示“任何主机”。

  • DbTable_nameColumn_nameRoutine_name 列不能包含通配符或为空。

服务器根据 HostDbUser 列对 tables_privcolumns_privprocs_priv 表进行排序。这与 db 表排序相似,但更简单,因为只有 Host 列可以包含通配符。

服务器使用排序后的表验证每个请求。对于需要管理员权限的请求,如 SHUTDOWNRELOAD,服务器只检查 userglobal_privilege 表,因为这些表指定了管理员权限。服务器授予访问权限,如果帐户在那些表中的行允许请求的操作,否则拒绝访问。例如,如果您想执行 mysqladmin shutdown 但您的 user 表行不授予 SHUTDOWN 权限,您的服务器将拒绝访问,而不需要检查 db 表,因为后者表中没有 Shutdown_priv 列。

对于数据库相关请求(INSERTUPDATE等),服务器首先检查用户的全局权限在user表行中(减去部分撤销的权限限制)。如果该行允许请求的操作,访问被授予。如果全局权限在user表中不足,服务器确定用户的数据库特定权限来自db表:

  • 服务器在db表中查找HostDbUser列的匹配项。

  • HostUser列与连接用户的主机名和MySQL用户名匹配。

  • Db列与用户想要访问的数据库匹配。

  • 如果没有HostUser的行,访问被拒绝。

在确定db表行授予的数据库特定权限后,服务器将其添加到user表行授予的全局权限。如果结果允许请求的操作,访问被授予。否则,服务器顺次检查用户的表和列权限在tables_privcolumns_priv表中,添加这些权限,并根据结果允许或拒绝访问。对于存储程序操作,服务器使用procs_priv表,而不是tables_privcolumns_priv

在布尔术语中,用户权限的计算描述可以总结如下:

global privileges
OR database privileges
OR table privileges
OR column privileges
OR routine privileges

可能不会明显为什么,如果全局权限最初被发现不足以请求的操作,服务器将其添加到数据库、表和列权限后。原因是请求可能需要多种类型的权限。例如,如果您执行一个INSERT INTO ... SELECT语句,您需要INSERTSELECT权限。您的权限可能是这样,您的user表行授予一个全局权限,而db表行授予另一个特定于相关数据库的权限。在这种情况下,您拥有必要的权限来执行请求,但是服务器不能从您的全局或数据库权限中确定这一点。它必须基于组合权限做出访问控制决策。