码迷,mamicode.com
首页 > 数据库 > 详细

mysql普通用户本机无法登录的解决办法

时间:2019-04-06 12:29:00      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:读者   第一条   access   user   star   返回   存在   top   查看   

背景

mysql和mariadb的用户表里存在匿名用户时,普通用户出现无法登录的情况


分析

先查看下用户表

mysql> select user, host, password from mysql.user;
+------+------------------+-------------------------------------------+
| User | Host             | Password                                  |
+------+------------------+-------------------------------------------+
| root | localhost        | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root | 127.0.0.1        | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| sweet| %                | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
| root | %                | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
|      | localhost        |                                           |
+------+------------------+-------------------------------------------+

最后一条user为空的记录就是匿名用户的记录



普通用户为什么无法登录呢?因为匿名用户的主机名(host)是localhost,当我们在本机登录时,我们只会输入user,

mysql -usweet -p

所以mysql默认host为localhost,由于mysql的规则是host优先级比user高,所以会先匹配host,mysql就会去用户表里取host=localhost的数据进行认证,所以普通用户(比如sweet)的记录当然就被过滤掉了,因而也就登录不上了,这里有读者可能就会问:%不是可以匹配所有的ip吗,那么应该也可以匹配localhost啊?是的,%可以匹配localhost,但是这里涉及到一个优先级的问题,匹配到了localhost就不会继续匹配%


mysql -usweet-p

当我们输入以上指令登录时,mysql的匹配逻辑是这样的:

  1. 匹配host,匹配成功(匹配到一条或多条)就进入下一步
  2. 匹配user,匹配到第一条后停止,进入下一步
  3. 有匹配验证密码,没有密码提示输入密码

这里需要注意:匿名用户的user为空(‘‘),是可以匹配所有字符的,所以只要有匿名用户存在,其余普通用户在本机是登录不上的!

我们以普通用户sweet和root用户为例分别模拟上述认证过程

sweet用户

  • 匹配host=localhost,匹配到两条记录
| root | localhost        | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
|      | localhost        |                                           |


  • 从以上两条记录中匹配user=sweet,匹配到一条记录(空字符可以匹配到所有字符)
|      | localhost        |                                           |


  • 匹配password,匹配失败,返回access denied



root用户

  • 匹配host=localhost,匹配到两条记录
| root | localhost        | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
|      | localhost        |                                           |


  • 从以上两条记录中匹配user=root,匹配到一条记录(root为非空,优先级高于空字符,匹配到一条就进入下一步)
|      | localhost        |                                           |


  • 匹配password,匹配成功,进入登录界面

补充:root用户可以登录的原因是mysql初始化时就在用户表里创建了一条root | localhost的记录,而root为非空,优先级高于空字符,所以先匹配到,因而roo用户可以正常登录


解决办法

删除匿名用户


查看用户表,找到匿名用户对应的记录

select user,host,password from mysql.user;


删除匿名用户

drop user ''@'localhost';


重启mysql服务

注意一定要重启服务才会生效!!!

linux下重启命令为:

systemctl stop mariadb
systemctl start mariadb

windows下重启命令为

net stop mysql
net start mysql

mysql普通用户本机无法登录的解决办法

标签:读者   第一条   access   user   star   返回   存在   top   查看   

原文地址:https://www.cnblogs.com/zzliu/p/10661295.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!