首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

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

     編輯:MySQL 綜合教學

核心概念:User + Host 雙重標識

MySQL 通過 user 表的 User 和 Host 兩列確定用戶身份。同一用戶名可對應不同 Host,權限各異。

匹配優先級規則

  1. Host 越精確優先級越高:localhost > 192.168.1.1 > 192.168.% > %
  2. User 非空優先於空:具體用戶名 > 匿名用戶('')
  3. Host 優先於 User 判斷:先鎖定 Host 範圍,再在該範圍內匹配 User

驗證函數對比

函數含義
USER()客戶端連接時指定的 用戶@主機
CURRENT_USER()實際匹配到的 mysql.user 記錄,決定權限

權限檢查順序

  1. 全局權限表 mysql.user
  2. 庫級權限表 mysql.db
  3. 表級 mysql.tables_priv、列級 mysql.columns_priv
  4. 存儲過程權限 mysql.procs_priv
  5. 以上均無匹配則拒絕執行

實戰演示:三層用戶遞減匹配

初始授權

GRANT SELECT ON *.* TO ''@'%' IDENTIFIED BY '123';           -- 匿名用戶
GRANT SELECT,CREATE ON *.* TO 'bruce'@'10.20.0.232' IDENTIFIED BY '123'; -- 精確 IP
GRANT SELECT,CREATE,DELETE ON *.* TO 'bruce'@'%' IDENTIFIED BY '123';   -- 通配符

階段 1:精確 IP 匹配

mysql -ubruce -p -h10.20.0.231
SELECT USER(), CURRENT_USER();
-- USER() = bruce@10.20.0.232
-- CURRENT_USER() = bruce@10.20.0.232  -- 命中精確 IP

階段 2:刪除精確 IP 用戶後,回退到通配符

DELETE FROM mysql.user WHERE user='bruce' AND host='10.20.0.232';
FLUSH PRIVILEGES;
-- 再次登入
SELECT USER(), CURRENT_USER();
-- USER() = bruce@10.20.0.232
-- CURRENT_USER() = bruce@%  -- 命中通配符

階段 3:刪除通配符用戶後,回退到匿名用戶

DELETE FROM mysql.user WHERE user='bruce' AND host='%';
FLUSH PRIVILEGES;
-- 再次登入
SELECT USER(), CURRENT_USER();
-- USER() = bruce@10.20.0.232
-- CURRENT_USER() = @%  -- 命中匿名用戶,僅擁有 SELECT 權限

最佳實踐建議

  • 避免使用匿名用戶(''@'%'),安全風險極高
  • 優先使用具體 IP 或 localhost,減少通配符 % 使用
  • 定期審計 mysql.user 表,清理無用賬號
  • 利用 SHOW GRANTS FOR 'user'@'host'; 核實實際權限
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved