問題場景
-- 兩個帳號
'thomas.loc.gov', 'fred' -- 具體主機
'%', 'fred' -- 萬用字元主機
-- 從 thomas.loc.gov 連線,兩者都匹配,用哪個?
匹配優先級演算法
- 啟動時讀取
mysql.user 並**排序**。
- 連線嘗試時,**按排序順序掃描,首個匹配生效**。
- 排序規則:
- Host 越具體越優先:具體主機名/IP >
%(萬用字元)。
- Host 相同時,**User 越具體越優先**:具體用戶名 > 空用戶名(萬用字元)。
排序示例
| 排序前 | 排序後 |
% root
% jeffrey
localhost root
localhost
|
localhost root
localhost
% jeffrey
% root
|
實務啟示
- 明確指定用戶名不一定被匹配:若有
'%','root' 和 'localhost','',從 localhost 連 root 會匹配第二個(空用戶名更具體?實際上 user 空值最不具體,但 host localhost 比 % 具體,所以 localhost 行優先;同 host 下 user root 比空具體,所以 root 優先)。
- 避免建立模糊重疊帳號,採用「最小權限、明確 Host/User」原則。
- 新增帳號後
FLUSH PRIVILEGES 重新排序生效。