全部博文(389)
分类: Mysql/postgreSQL
2014-04-03 21:30:32
MySQL认证用户的顺序
mysql的用户认证和其他的数据库一个很大的不同就是msyql数据库用户可以分为两部分
一部分是用户名,一部分是主机名.如,'root'@'192.168.10.150',对于后面的ip地址如果有
多个值可选的话,这时候谁最先匹配就成了最重要的.
当mysql客户端在连接mysql服务器的时候,mysql最先检查主机部分,即使后续有更加宽松
的限制,同时也满足的话,mysql也不会再去做匹配.由于mysql的这种匹配规则顺序,经常使得用户
明明查看到有相应的用户和主机也无法连接上.
比如当前的用户情况.
mysql> select user,host from mysql.user;
+-------+---------------+
| user | host |
+-------+---------------+
| frank | % |
| rep | % |
| root | % |
| ggs | 127.0.0.1 |
| root | 192.168.10.150 |
| root | ::1 |
| root | localhost |
+-------+---------------+
7 rows in set (0.00 sec)
的密码是root,'root'@'192.168.10.150'的密码是abc;
我们在192.168.10.150的机器上登录,用abc密码可以登录成功
[root@c12 ~]# mysql -u root -pabc -s -h 192.168.10.145
mysql>
再试一下用root密码登录
[root@c12 ~]# mysql -u root -proot -s -h 192.168.10.145
ERROR 1045 (28000): Access denied for user (using password: YES)
登录报错.通过测试我们发现通过mysql.user的host进行desc排序,这个顺序就是mysql匹配主机字符串的顺序
mysql> select user,host from mysql.user order by host desc;
+-------+---------------+
| user | host |
+-------+---------------+
| root | localhost |
| root | ::1 |
| root | 192.168.10.150 |
| ggs | 127.0.0.1 |
| root | % |
| rep | % |
| frank | % |
+-------+---------------+
7 rows in set (0.00 sec)
可以看出host从上往下依次匹配的顺序,先是主机,最后是%号.
同时通过上以测试我们发现在第一个主机匹配成功后,后续即使密码相同,mysql也不去匹配了.
[root@c12 ~]# mysql -u root -proot -s -h 192.168.10.145
这条连接请求,也符合倒数第三个主机和用户名对,但是当主机第一条192.168.10.150已经匹配成功了,但密码不一致,
导致失败,mysql拒绝用户的连接请求.