[root@mysql01 ~]# mysql -userver -p123456
本地登录失败;
[root@mysql02 ~]# mysql -h192.168.47.166 -userver -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.36-log Source distribution
远程登录成功;
一、登录后查看mysql.user表的情况
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcukjYxIGZ2YDOiNTZllzM2MWZ5YDNjZTO0ETZkZGZyATYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
可以看到,我的数据库中有server用户和匿名用户localhost;
server用户的密码是'server' 匿名用户的密码为空
二、在本机用server用户登录,发现不用密码可以登录;
[root@mysql01 ~]# mysql -userver -p
Enter password:
Your MySQL connection id is 3
Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SELECT USER(), CURRENT_USER();
+--------------------------+-----------------------+
| USER() | CURRENT_USER() |
+-------------------------+------------------------+
| server@localhost | @localhost |
+-------------------------+-------------------------+
1 row in set (0.00 sec)
登录成功了,使用USER()和CURRENT_USER()两个函数查看所使用的用户。
USER()函数返回你在客户端登陆时指定的用户名和主机名。 CURRENT_USER()函数返回的是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字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。
了解了这个认证流程,就知道为什么server登录失败了。
匿名用户能够匹配的原因上面说过,空字符串可以匹配所有的用户名,就像通配符一样。
根据MySQL认证时的排序规则,第一个条目的用户名排序更前,第二个条目的主机名更精确,排序更前。
解决的方法:删除匿名用户(仅仅为了安全也有这个必要)
为什么root用户不会受影响,而只有普通用户不能从本地登录?
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
以上方法参考Google的搜索结果,并经过实际的测试和验证;