MySQL权限管理避坑指南:从GRANT到REVOKE,新手最容易搞混的5个细节
刚接触MySQL权限管理时,很多人会觉得GRANT和REVOKE命令看起来很简单,但实际操作中却经常遇到各种"诡异"问题。比如明明已经授权了,用户却说没有权限;或者回收了权限,却发现还能继续操作。这些问题背后往往隐藏着MySQL权限系统的精妙设计。
1. 主机名通配符:@localhost和@%的区别与陷阱
很多新手在创建用户时,对user@localhost和user@%的区别感到困惑。这两者看似只是主机名不同,实际却代表着完全不同的访问控制逻辑。
user@localhost:只允许从MySQL服务器本机通过本地socket连接user@%:允许从任何主机通过TCP/IP连接(除非配置了skip-networking)
常见误区:
sql复制-- 错误示范:以为这样就能允许本地和远程连接
GRANT ALL ON db.* TO 'user'@'localhost';
GRANT ALL ON db.* TO 'user'@'%';
实际上,MySQL将这两个视为完全不同的用户账户!它们可以有不同的密码和权限。更合理的做法是:
sql复制-- 正确做法:统一密码
CREATE USER 'user'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
GRANT ALL ON db.* TO 'user'@'localhost';
GRANT ALL ON db.* TO 'user'@'%';
提示:生产环境中,建议限制
@%的使用,只开放必要的远程访问权限。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. WITH GRANT OPTION的隐藏风险
WITH GRANT OPTION是一个强大的功能,允许被授权用户将自己的权限授予其他用户。但这也是一把双刃剑。
危险场景:
sql复制-- user1可以将权限继续授予user2
GRANT SELECT ON db.* TO 'user1'@'%' WITH GRANT OPTION;
此时,user1可以执行:
s复制
