MySQL 普通用户无法登陆的解决方案

之前一个客户的项目,使用root用户连接的MySQL数据,为了提高安全性,准备降权为普通用户连接。

使用grant语句建立了用户,主机限制使用的%,也就是不限制主机。(因为没有开启MySQL端口,所以localhost也意义不大)。FLUSH PRIVILEGES也是执行了的。

但是登录的提示就一直登录不上,如下图。

MySQL 普通用户无法登陆的解决方案

以为密码输错了,还使用 set password for 重置了MySQL用户密码,依旧无法登陆。怀疑人生的我去看了用户表,用户也是存在的,主机也确实没限制,如下图。

MySQL 普通用户无法登陆的解决方案

于是查询解决方案,查出了以下知识点。

MySQL的简要认证算法如下:

当用户从客户端请求登陆时,MySQL将授权表中的条目与客户端所提供的条目进行比较,包括用户的用户名,密码和主机。

授权表中的Host字段是可以使用通配符作为模式进行匹配的,如test.example.com, %.example.com, %.com和%都可以匹配test.example.com这个主机。

授权表中的User字段不允许使用模式匹配,但是可以有一个空字符的用户名代表匿名用户,并且空字符串可以匹配所有的用户名,就像通配符一样。

当user表中的Host和User有多个值可以匹配客户端提供的主机和用户名时,MySQL将user表读入内存,并且按照一定规则排序,按照排序规则读取到的第一个匹配客户端用户名和主机名的条目对客户端进行身份验证。

排序规则:
对于Host字段,按照匹配的精确程度进行排序,越精确的排序越前,例如当匹配test.example.com这个主机时, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。
对于User字段,非空的字符串用户名比空字符串匹配的用户名排序更靠前。
User和Host字段都有多个匹配值,MySQL使用主机名排序最前的条目,在主机名字段相同时再选取用户名排序更前的条目。
因此,如果User和Host字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。

引用自cnblogs

这样一来,问题解决方案就出来了。解决方案:删除库中存在的匿名用户

经过查询,确实存在匿名用户,如下图,删除后即可成功登录。

MySQL 普通用户无法登陆的解决方案

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系电话

17689511878

17759303055

微信
微信
分享本页
返回顶部