菜鸟科技网

MySQL如何查看所有用户及其权限?

查询 mysql.user

所有在 MySQL 服务器上创建的用户信息都存储在 mysql 数据库的 user 表中,这是最直接、最权威的查看方式。

MySQL如何查看所有用户及其权限?-图1
(图片来源网络,侵删)

查看所有用户及其主机

这个命令会列出所有用户以及他们可以从哪些主机连接到 MySQL 服务器。

SELECT host, user FROM mysql.user;

示例输出:

+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | root             |
| 127.0.0.1 | root             |
| ::1       | root             |
| localhost | debian-sys-maint |
| %         | myapp_user       |
+-----------+------------------+

解释:

  • host: 指定了用户可以从哪个主机地址连接。
    • localhost: 只能从本机(通过 Unix socket 或 TCP/IP 环回地址)连接。
    • 0.0.1: 只能从本机的 TCP/IP 环回地址连接。
    • :1: IPv6 的环回地址。
    • 通配符,表示从任何主机都可以连接(即远程连接),这是一个安全风险,应谨慎使用。
  • user: 用户名。

查看特定用户的完整权限信息

如果你想了解一个用户拥有哪些具体的权限(SELECT, INSERT, UPDATE 等),你需要查询 mysql 数据库中的多个权限表。

MySQL如何查看所有用户及其权限?-图2
(图片来源网络,侵删)

mysql.user 表存储了用户的全局权限(对所有数据库都有效),而 mysql.db, mysql.tables_priv, mysql.columns_priv 等表则存储了更细粒度的数据库、表、列级别的权限。

要查看一个用户的全部权限,可以执行以下查询:

-- 查看用户 'myapp_user' 的所有权限
SHOW GRANTS FOR 'myapp_user'@'%';

示例输出:

+-----------------------------------------------------------------------------------------------------------------+
| Grants for myapp_user@%                                                                                         |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'myapp_user'@'%' IDENTIFIED BY PASSWORD '*...'                                           |
| GRANT SELECT, INSERT, UPDATE ON `my_database`.* TO 'myapp_user'@'%'                                            |
+-----------------------------------------------------------------------------------------------------------------+

解释:

MySQL如何查看所有用户及其权限?-图3
(图片来源网络,侵删)
  • USAGE ON *.*: 表示该用户没有任何全局权限(除了连接和认证的权限)。
  • GRANT SELECT, INSERT, UPDATE ON my_database.*: 表示该用户对 my_database 下的所有表拥有 SELECT, INSERT, UPDATE 权限。

查看当前登录的用户

如果你想确认你当前正在使用哪个用户身份登录,可以使用 CURRENT_USER() 函数。

SELECT CURRENT_USER();

示例输出:

+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+

这个结果告诉你,当前会话的用户是 root,并且是从 localhost 连接的。


常用查询场景和组合命令

只显示可以远程登录的用户

如果你想快速找出所有可以从外部服务器连接的用户(即 host 字段不是 localhost 的用户),可以这样做:

SELECT host, user FROM mysql.user WHERE host != 'localhost';

或者更精确地,查找 host 为 或包含 IP 地址的用户:

SELECT host, user FROM mysql.user WHERE host = '%' OR host NOT IN ('localhost', '127.0.0.1', '::1');

查看用户创建语句

如果你想查看创建某个用户的原始 SQL 命令(包含密码哈希值),可以使用 SHOW CREATE USER 命令。

SHOW CREATE USER 'myapp_user'@'%';

示例输出:

+-----------+----------------------------------------------------------------------------------------------------------------------------------+
| User      | Create User                                                                                                                      |
+-----------+----------------------------------------------------------------------------------------------------------------------------------+
| myapp_user@% | CREATE USER 'myapp_user'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*...' PASSWORD EXPIRE NEVER PASSWORD HISTORY DEFAULT  |
|           | PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT                                                                  |
+-----------+----------------------------------------------------------------------------------------------------------------------------------+

这对于备份用户配置或理解用户的认证方式很有用。


总结表格

命令 功能 示例
SELECT host, user FROM mysql.user; 查看所有用户及其允许连接的主机 SELECT host, user FROM mysql.user;
SHOW GRANTS FOR 'user'@'host'; 查看特定用户的详细权限 SHOW GRANTS FOR 'myapp_user'@'%';
SELECT CURRENT_USER(); 查看当前登录的用户 SELECT CURRENT_USER();
SELECT host, user FROM mysql.user WHERE host != 'localhost'; 查看所有可以远程登录的用户 SELECT host, user FROM mysql.user WHERE host != 'localhost';
SHOW CREATE USER 'user'@'host'; 查看创建用户的原始SQL语句 SHOW CREATE USER 'myapp_user'@'%';

注意事项

  1. 权限要求: 执行这些查询通常需要你拥有 mysql 数据库的 SELECT 权限,只有 root 或其他管理员用户才有此权限。
  2. 密码是哈希值: 在 mysql.user 表中,authentication_string 字段存储的是密码的哈希值,而不是明文密码,这是出于安全考虑。
  3. 权限的层级: MySQL 的权限是分层的,一个用户可能拥有全局权限(ON *.*),但同时又被授予了特定数据库的权限,后者会覆盖或补充前者。SHOW GRANTS 命令会为你清晰地展示所有生效的权限。
分享:
扫描分享到社交APP
上一篇
下一篇