MySQL 用戶唯一標識為 User@Host 組合,同一用戶名不同 Host 視為不同賬號。
localhost > 192.168.1.1 > wiki.domain.com192.168.% > %.domain.com > 192.% > %.cn > %| 函數 | 含義 | 用途 |
|---|---|---|
| USER() | 客戶端連接時聲明的用戶@主機 | 審計連接來源 |
| CURRENT_USER() | 服務端實際匹配的 user 表記錄 | 確定實際生效權限 |
mysql.user 表全局權限mysql.db 表庫級權限mysql.tables_priv / mysql.columns_priv 表/列級權限mysql.procs_priv 存儲過程權限-- 匿名用戶(最低優先級) GRANT SELECT ON *.* TO ''@'%' IDENTIFIED BY '123'; -- 精確 IP 用戶(最高優先級) GRANT SELECT, CREATE ON *.* TO 'bruce'@'10.20.0.232' IDENTIFIED BY '123'; -- 通配符用戶(中間優先級) GRANT SELECT, CREATE, DELETE ON *.* TO 'bruce'@'%' IDENTIFIED BY '123';
-- 步驟 1:精確 IP 用戶存在時 SELECT USER(), CURRENT_USER(); -- 結果:bruce@10.20.0.232 / bruce@10.20.0.232 ✓ 精確匹配 -- 步驟 2:刪除精確 IP 用戶後 DELETE FROM mysql.user WHERE User='bruce' AND Host='10.20.0.232'; FLUSH PRIVILEGES; SELECT USER(), CURRENT_USER(); -- 結果:bruce@10.20.0.232 / bruce@% ✓ 降級匹配通配符 -- 步驟 3:刪除通配符用戶後 DELETE FROM mysql.user WHERE User='bruce' AND Host='%'; FLUSH PRIVILEGES; SELECT USER(), CURRENT_USER(); -- 結果:bruce@10.20.0.232 / @% ✓ 最終匹配匿名用戶
MySQL 初始化會創建 ''@'%' 匿名用戶,默認擁有:
SELECT 權限test 庫及 test_% 庫的完整權限安全建議:DROP USER ''@'%'; 立即刪除。
用戶@具體IP段 授權,避免 %SELECT User, Host FROM mysql.user;DROP USER 'old'@'%';REVOKE ... ON ... FROM 'user'@'host';PASSWORD() 函數(8.0+ 內部自動處理)理解 Host 匹配優先級 > 用戶名優先級 > 匿名用戶兜底 這一層級遞降機制,是排查「明明授權了卻無權限」或「刪除用戶後仍能登錄」等疑難雜症的鑰匙。