mysql的用户身份验证核心查询的是mysql数据库下的user表,这个表是mysql存储用户身份信息和全局权限的核心系统表,所有尝试连接mysql服务的用户请求,都会首先匹配这个表中的记录完成身份验证。

user表的基本结构
user表的字段可以分为三类,分别是用户身份标识字段、密码相关字段和权限字段,以下是部分核心字段的说明:
| 字段名 | 说明 |
|---|---|
| Host | 允许登录的主机地址,支持通配符,%表示允许所有主机登录 |
| User | 登录使用的用户名 |
| authentication_string | 用户的密码密文,不同mysql版本字段名可能有差异,旧版本为Password字段 |
| plugin | 使用的密码认证插件,比如mysql_native_password、caching_sha2_password等 |
身份验证的查询逻辑
当用户发起mysql连接请求时,mysql服务会按照以下逻辑查询user表完成验证:
- 首先匹配请求中的用户名和
User字段,找到所有对应用户的记录 - 再从匹配到的记录中,筛选
Host字段和请求来源IP匹配的记录 - 最后使用
plugin字段指定的认证插件,校验请求中的密码和authentication_string字段存储的密文是否匹配 - 如果以上步骤全部匹配成功,身份验证通过,否则返回登录失败错误
相关操作示例
查询所有用户身份信息
可以通过以下sql语句查看user表中的所有用户记录:
-- 查询mysql.user表中的所有用户记录 SELECT Host, User, plugin, authentication_string FROM mysql.user;
创建新用户时的表操作
使用CREATE USER语句创建用户时,本质就是向user表中插入一条新记录:
-- 创建允许本地登录的用户test,密码为123456
CREATE USER 'test'@'localhost' IDENTIFIED BY '123456';
-- 等价于手动向user表插入记录,不过不建议直接操作表,优先使用官方语句
-- INSERT INTO mysql.user (Host, User, authentication_string, plugin) VALUES ('localhost', 'test', PASSWORD('123456'), 'mysql_native_password');
修改用户密码的底层逻辑
修改用户密码时,实际是更新user表中对应用户的authentication_string字段:
-- 修改test用户的密码为654321 ALTER USER 'test'@'localhost' IDENTIFIED BY '654321'; -- 刷新权限使修改生效 FLUSH PRIVILEGES;
注意事项
虽然可以直接修改user表来操作用户和权限,但官方不建议直接操作系统表,因为容易破坏表结构或者导致权限异常。所有用户和权限相关的操作,优先使用CREATE USER、GRANT、ALTER USER等官方提供的sql语句,操作完成后执行FLUSH PRIVILEGES刷新权限缓存即可。
另外不同mysql版本的user表字段会有细微差异,比如mysql 5.7之前密码字段名为Password,mysql 8.0之后默认认证插件改为caching_sha2_password,如果需要兼容旧客户端,可以手动修改用户的plugin字段为mysql_native_password。
mysqluser_table身份验证权限管理修改时间:2026-07-18 05:06:19