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


背景

mysql和mariadb的用戶表里存在匿名用戶時,普通用戶出現無法登錄的情況


## 分析 先查看下用戶表 ```sql 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為空的記錄就是匿名用戶的記錄

<br>
普通用戶為什么無法登錄呢?因為匿名用戶的主機名(host)是localhost,當我們在本機登錄時,我們只會輸入user,
```sql
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,匹配到一條記錄(空字符可以匹配到所有字符) ```sql | | localhost | | ```
- 匹配password,匹配失敗,返回access denied
root用戶
  • 匹配host=localhost,匹配到兩條記錄
| root | localhost        | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
|      | localhost        |                                           |

- 從以上兩條記錄中匹配user=root,匹配到一條記錄(root為非空,優先級高於空字符,匹配到一條就進入下一步) ```sql | | localhost | | ```
- 匹配password,匹配成功,進入登錄界面

補充:root用戶可以登錄的原因是mysql初始化時就在用戶表里創建了一條root | localhost的記錄,而root為非空,優先級高於空字符,所以先匹配到,因而roo用戶可以正常登錄


## 解決辦法

刪除匿名用戶


### 查看用戶表,找到匿名用戶對應的記錄 ```sql select user,host,password from mysql.user;

<br>
### 刪除匿名用戶

```sql
drop user ''@'localhost';


重啟mysql服務

注意一定要重啟服務才會生效!!!

linux下重啟命令為:

systemctl stop mariadb
systemctl start mariadb

windows下重啟命令為

net stop mysql
net start mysql


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM