mysql普通用戶本機無法登錄的解決辦法
阿新 • • 發佈:2019-04-06
失敗 繼續 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的匹配邏輯是這樣的:
- 匹配host,匹配成功(匹配到一條或多條)就進入下一步
- 匹配user,匹配到第一條後停止,進入下一步
- 有匹配驗證密碼,沒有密碼提示輸入密碼
這裏需要註意:匿名用戶的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普通用戶本機無法登錄的解決辦法