在MySQL中,權限管理是保障數據安全和合理使用的重要手段。MySQL提供了豐富的權限控制機制,允許管理員對不同用户授予不同級別的操作權限。本文將會對MySQL中的權限管理,以及內核如何實現權限控制進行介紹。
一、權限級別
MySQL 的權限是分層的,權限可以授予不同級別的對象:
全局權限: 作用於整個 MySQL 服務器實例的所有數據庫,授予全局權限的用户可以對服務器上的任何數據庫和對象進行操作,存儲在 mysql.user 表。
- ALL PRIVILEGES:授予用户所有可用的權限。
- CREATE:允許用户創建新的數據庫和表。
- DROP:允許用户刪除數據庫和表。
- ALTER:允許用户修改表結構,如添加、刪除列等。
- INDEX:允許用户創建和刪除索引。
- GRANT OPTION:允許用户將自己擁有的權限授予其他用户。
數據庫權限: 作用於特定數據庫(或匹配模式的所有數據庫)中的所有對象,存儲在 mysql.db 和 mysql.host 表(後者很少用)。
- CREATE TEMPORARY TABLES:允許用户在指定數據庫中創建臨時表。
- SHOW VIEW:允許用户查看指定數據庫中視圖的定義。
- CREATE ROUTINE:允許用户在指定數據庫中創建存儲過程和函數。
- ALTER ROUTINE:允許用户修改指定數據庫中存儲過程和函數的定義。
- EXECUTE:允許用户執行指定數據庫中的存儲過程和函數。
表權限: 作用於特定表(或匹配模式的所有表)中的所有列,存儲在 mysql.tables_priv 表。
- SELECT:允許用户從表中查詢數據。
- INSERT:允許用户向表中插入新數據。
- UPDATE:允許用户修改表中的數據。
- DELETE:允許用户刪除表中的數據。
- REFERENCES:允許用户創建外鍵關聯。
列權限: 作用於特定表中的特定列,存儲在 mysql.columns_priv 表。
可以針對表中的特定列授予 SELECT、INSERT、UPDATE 等權限,限制用户只能對指定列進行操作。
程序權限: 作用於存儲過程、存儲函數,存儲在 mysql.procs_priv 表。
- PROCESS:允許用户查看所有正在執行的線程信息。
- SHOW DATABASES:允許用户查看所有數據庫的列表。
- RELOAD:允許用户重新加載權限表和刷新日誌。
- SHUTDOWN:允許用户關閉 MySQL 服務器。
global、database、table、column、routines,控制層級示意圖:
權限管理操作
創建用户:
-- 創建一個新用户,用户名為 'test_user',密碼為 'test_password'
CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'test_password';
授予權限:
GRANT privilege_type [(column_list)] [, privilege_type [(column_list)] ...]
ON [object_type] privilege_level
TO user_or_role [, user_or_role ...]
[WITH GRANT OPTION]; -- 謹慎使用
查看權限:
SHOW GRANTS; -- 查看當前用户權限
SHOW GRANTS FOR 'username'@'host'; -- 查看指定用户權限
SELECT * FROM mysql.user WHERE User='username' AND Host='host'\G -- 查看 user 表信息 (謹慎)
SELECT * FROM mysql.db WHERE User='username' AND Host='host'\G -- 查看 db 表權限
-- 類似可以查看 tables_priv, columns_priv, procs_priv
撤銷權限:
REVOKE [GRANT OPTION FOR] privilege_type [(column_list)] [, privilege_type [(column_list)] ...]
ON [object_type] privilege_level
FROM user_or_role [, user_or_role ...];
參考文章:MySQL權限詳解