首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 用戶認證與權限驗證機制深度解析:Host 匹配優先級實戰驗證

     編輯:MySQL 資料庫相關知識

一、認證核心邏輯:User + Host 雙主鍵

MySQL 用戶唯一標識為 User@Host 組合,同一用戶名不同 Host 視為不同賬號。

二、Host 匹配優先級規則(由高到低)

  1. 精確匹配優先:localhost > 192.168.1.1 > wiki.domain.com
  2. 通配符層級:192.168.% > %.domain.com > 192.% > %.cn > %
  3. 用戶名優先級:具體用戶名 > 匿名用戶(空用戶名)
  4. Host 欄優先於 User 欄:先鎖定 Host 範圍,再在範圍內匹配 User

三、驗證函數:user() vs current_user()

函數含義用途
USER()客戶端連接時聲明的用戶@主機審計連接來源
CURRENT_USER()服務端實際匹配的 user 表記錄確定實際生效權限

四、權限檢查執行順序

  1. mysql.user 表全局權限
  2. mysql.db 表庫級權限
  3. mysql.tables_priv / mysql.columns_priv 表/列級權限
  4. mysql.procs_priv 存儲過程權限
  5. 全部失敗 → 拒絕執行

五、實戰驗證:三層用戶遞降匹配

1. 建立測試用戶

-- 匿名用戶(最低優先級)
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';

2. 從 10.20.0.232 連接測試

-- 步驟 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 ''@'%'; 立即刪除。

七、生產環境權限管理清單

  1. 按 用戶@具體IP段 授權,避免 %
  2. 定期審計:SELECT User, Host FROM mysql.user;
  3. 移除無用賬號:DROP USER 'old'@'%';
  4. 回收過期權限:REVOKE ... ON ... FROM 'user'@'host';
  5. 密碼加密存儲:PASSWORD() 函數(8.0+ 內部自動處理)

理解 Host 匹配優先級 > 用戶名優先級 > 匿名用戶兜底 這一層級遞降機制,是排查「明明授權了卻無權限」或「刪除用戶後仍能登錄」等疑難雜症的鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved