1. 程式人生 > >mysql普通用戶本機無法登錄的解決辦法

mysql普通用戶本機無法登錄的解決辦法

失敗 繼續 sel 但是 net 其余 補充 art 解決

背景

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普通用戶本機無法登錄的解決辦法