MySQL中'user1'@'localhost'为何可使用'user1'@'%'的权限?
MySQL权限判断逻辑解析
你的问题核心在于MySQL权限系统的多账户权限合并机制,以下是具体逻辑拆解:
1. 登录时的用户匹配规则
MySQL登录时会优先匹配最精确的主机模式:
localhost属于精确匹配本地连接,优先级高于通配符%(匹配任意主机)- 因此你用
pwlocalhost登录时,会匹配到'user1'@'localhost'账户,这也是USER()返回该结果的原因
2. 权限检查的核心逻辑
MySQL执行权限校验时,不会只局限于当前登录的单个账户,而是会收集所有满足以下两个条件的账户权限,取权限的并集:
- 用户名与当前登录用户完全一致(此处均为
user1) - 账户的主机模式能够匹配当前连接的实际主机(当前连接主机是
localhost,'user1'@'localhost'和'user1'@'%'的主机模式都能匹配它)
也就是说,虽然'user1'@'localhost'仅拥有USAGE权限,但'user1'@'%'拥有db1.*的全部权限,两个账户的权限会被合并,因此你能正常执行SELECT * FROM db1.tb1操作。
3. SHOW GRANTS的显示局限
SHOW GRANTS仅会展示当前登录的具体账户的权限,不会显示其他同名账户的权限,这就造成了“权限显示与实际操作不符”的错觉。若要查看所有user1相关账户的权限,可直接查询系统权限表:
-- 查看全局权限 SELECT user, host, Select_priv, Insert_priv FROM mysql.user WHERE user='user1'; -- 查看数据库级权限 SELECT user, host, db, Select_priv FROM mysql.db WHERE user='user1';
反向验证
你可以通过以下操作验证上述逻辑:
- 撤销
'user1'@'%'的db1权限:REVOKE ALL ON db1.* FROM 'user1'@'%'; - 再次用
'user1'@'localhost'登录执行SELECT * FROM db1.tb1,此时会提示权限不足,证明之前的操作权限确实来自'user1'@'%'的权限合并。
内容的提问来源于stack exchange,提问作者Chaoping
相关产品推荐
相关产品推荐

