MySQL Workbench中的权限设置不生效

🖼️现象:

这个test账号我只给了两个数据库权限,为什么它连接还是能看到其他数据库。下图是这个账号的设置。

test 账号能看到其他数据库,很可能是因为它拥有了某个"全局级别"的权限,比如 SHOW DATABASES。只要用户有任意一个全局权限,MySQL 就会允许他查看服务器上所有数据库的名字,这可能会造成一些安全风险。

🔑 为什么一个全局权限会导致看到所有数据库?

在 MySQL 中,权限的授予范围是分层级的。其中,"全局权限"(*.*)是所有权限里最高的一级。根据 MySQL 的官方设计,只要用户拥有了任何一个全局权限,系统在执行 SHOW DATABASES 命令时,就会向其展示服务器上所有数据库的名称

🕵️‍♂️ 排查问题:test 账号拥有哪些权限?

按照下面的步骤来检查 test 账号的具体权限,应该就能找到是哪个全局权限导致了问题。

  1. 登录数据库 :用 root 或其他有管理权限的账号登录 MySQL。

    bash 复制代码
    mysql -u root -p
  2. 查看用户权限:在 MySQL 命令行中,执行以下 SQL 命令:

    bash 复制代码
    SHOW GRANTS FOR 'test'@'%';

    请注意 :账号由用户名 (test) 和主机名 (%) 共同组成。

  3. 分析返回结果 :重点检查输出中是否包含 GRANT ... ON \*.\* TO ... 这样的语句。这类语句就代表了全局权限。

🔧 解决方案:如何限制用户只能看到授权的数据库?

想解决这个问题,核心思路就是移除用户多余的全局权限。

1. 方案一:移除 SHOW DATABASES 权限(推荐)

如果你只希望用户看不到其他数据库,但无需回收他的其他权限,可以只撤销 SHOW DATABASES 权限。在命令行中执行:

bash 复制代码
REVOKE SHOW DATABASES ON *.* FROM 'test'@'%';
2. 方案二:检查并回收不必要的全局权限

你也可以选择移除所有不必要的全局权限,仅保留数据库级别的授权。操作前请先查询并评估,再执行撤销:

bash 复制代码
-- 1. 查询当前权限以评估
SHOW GRANTS FOR 'test'@'%';
-- 2. 移除不必要的全局权限,例如:
REVOKE SELECT ON *.* FROM 'test'@'%';
3. 验证结果

执行权限回收后,可以让 test 重新登录并运行 SHOW DATABASES; 命令,检查数据库列表是否已符合预期。

💎 核心总结

理解权限层级是关键,MySQL 的这种设计是为了兼顾安全性可用性

  • 安全性优先 :默认行为是"最小权限原则",即用户只能看到自己有权限访问的数据。这有效防止了低权限用户通过 SHOW DATABASES 来探测服务器上的所有数据库名称,降低了信息泄露的风险。
  • 全局权限的双刃剑:作为最高层级的权限,全局权限能极大地方便管理员操作,但也会产生"看到所有数据库"的副作用。因此,在给普通业务账号授予任何全局权限时,都需格外谨慎。
相关推荐
草莓熊Lotso1 小时前
Vibe Coding 时代:LangChain 与 LangGraph 全链路解析
linux·运维·服务器·数据库·人工智能·mysql·langchain
zh1570236 小时前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
代码AI弗森6 小时前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库
摇滚侠7 小时前
expdp 查看帮助
java·数据库·oracle
流年似水~7 小时前
MCP协议实战:从零搭建一个让Claude能“看见“数据库的工具服务
数据库·人工智能·程序人生·ai·ai编程
2401_871492857 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
志栋智能8 小时前
超自动化安全:构建智能安全运营的核心引擎
大数据·运维·服务器·数据库·安全·自动化·产品运营
zhoutongsheng9 小时前
C#怎么实现Swagger文档 C#如何在ASP.NET Core中集成Swagger自动生成API文档【框架】
jvm·数据库·python
WinterKay9 小时前
【开源】我写了一个轻量级本地数据库浏览工具,支持 MySQL/Redis 只读查询
数据库·mysql·开源
zxrhhm10 小时前
Oracle 索引完整指南
数据库·oracle