前言
MySQL 的權限表在數據庫啟動的時候就載入內存,當用戶通過身份認證后,就在內存中進行相應權限的存取,這樣,此用戶就可以在數據庫中做權限范圍內的各種操作了。
下面話不多說了,來一起看看詳細的介紹吧
mysql 的權限體系大致分為5個層級:
全局層級
全局權限適用于一個給定服務器中的所有數據庫。這些權限存儲在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤銷全局權限。
數據庫層級
數據庫權限適用于一個給定數據庫中的所有目標。這些權限存儲在mysql.db和mysql.host表中。GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤銷數據庫權限。
表層級
表權限適用于一個給定表中的所有列。這些權限存儲在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表權限。
列層級
列權限適用于一個給定表中的單一列。這些權限存儲在mysql.columns_priv表中。當使用REVOKE時,您必須指定與被授權列相同的列。
子程序層級
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權限適用于已存儲的子程序。這些權限可以被授予為全局層級和數據庫層級。而且,除了CREATE ROUTINE外,這些權限可以被授予為子程序層級,并存儲在mysql.procs_priv表中。
這些權限信息存儲在下面的系統表中:
mysql.user
mysql.db
mysql.host
mysql.table_priv
mysql.column_priv
當用戶連接進來,mysqld會通過上面的這些表對用戶權限進行驗證!
一、權限表的存取
在權限存取的兩個過程中,系統會用到 “mysql” 數據庫(安裝 MySQL 時被創建,數據庫名稱叫“mysql”) 中 user、host 和 db 這3個最重要的權限表。
在這 3 個表中,最重要的表示 user 表,其次是 db 表,host 表在大多數情況下并不使用。
user 中的列主要分為 4 個部分:用戶列、權限列、安全列和資源控制列。
通常用的最多的是用戶列和權限列,其中權限列又分為普通權限和管理權限。普通權限用于數據庫的操作,比如 select_priv、super_priv 等。
當用戶進行連接時,權限表的存取過程有以下兩個過程:
先從 user 表中的 host、user 和 password 這 3 個字段中判斷連接的 IP、用戶名、和密碼是否存在于表中,如果存在,則通過身份驗證,否則拒絕連接。
如果通過身份驗證、則按照以下權限表的順序得到數據庫權限:user -> db -> tables_priv -> columns_priv。
在這幾個權限表中,權限范圍依次遞減,全局權限覆蓋局部權限。上面的第一階段好理解,下面以一個例子來詳細解釋一下第二階段。
新聞熱點
疑難解答