標籤:
安裝Mysql時會自動安裝一個名為mysql的資料庫。這個資料庫下面儲存的是許可權表。
Mysql會根據這些許可權表的內容為每個使用者賦予相應的許可權
所以我們也是通過這些表來實現系統管理使用者和許可權的
use mysql;show tables;+---------------------------+| Tables_in_mysql |+---------------------------+| columns_priv || db || event || func || general_log || help_category || help_keyword || help_relation || help_topic || innodb_index_stats || innodb_table_stats || ndb_binlog_index || plugin || proc || procs_priv || proxies_priv || servers || slave_master_info || slave_relay_log_info || slave_worker_info || slow_log || tables_priv || time_zone || time_zone_leap_second || time_zone_name || time_zone_transition || time_zone_transition_type || user |+---------------------------+
user表
1. user表的作用相當與mysql工作流程中的"使用者管理模組",它決定著我們對一個串連允許或拒絕
2. user表用於記錄允許串連到伺服器的使用者帳號資訊,裡面的許可權是全域級的
3. 根據user表結構,表的欄位可以分為4類
(1) 使用者列
Host主機名稱、User使用者名稱、Password密碼
(2) 許可權列(以priv結尾的)
包含普通許可權:查詢許可權、修改許可權等
和進階系統管理權限:關閉服務許可權、超級許可權、載入使用者
這些欄位只有N和Y兩個選項,為安全期間預設值都設為N
Grant_priv是否有Grant許可權、Shutdown_priv是否有停止mysql服務的許可權
Super_priv是否有超級許可權、Execute_priv是否有執行預存程序和函數的許可權
(3) 安全列
(4) 資源控制列
這些欄位預設值為0,表示沒有限制
max_questions 每小時允許執行多少次查詢
max_updates 每小時允許執行多少次更新
max_connections 每小時允許建立多少串連
max_user_connections 單個使用者可以同時具有的串連數
desc user;+------------------------+-----------------------------------+------+-----+----| Field | Type | Null | Key | Default | Extra |+------------------------+-----------------------------------+------+-----+---| Host | char(60) | NO | PRI | | || User | char(16) | NO | PRI | | || Password | char(41) | NO | | | || Select_priv | enum(‘N‘,‘Y‘) | NO | | N | || Insert_priv | enum(‘N‘,‘Y‘) | NO | | N | || Update_priv | enum(‘N‘,‘Y‘) | NO | | N | || Delete_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_priv | enum(‘N‘,‘Y‘) | NO | | N | || Drop_priv | enum(‘N‘,‘Y‘) | NO | | N | || Reload_priv | enum(‘N‘,‘Y‘) | NO | | N | || Shutdown_priv | enum(‘N‘,‘Y‘) | NO | | N | || Process_priv | enum(‘N‘,‘Y‘) | NO | | N | || File_priv | enum(‘N‘,‘Y‘) | NO | | N | || Grant_priv | enum(‘N‘,‘Y‘) | NO | | N | || References_priv | enum(‘N‘,‘Y‘) | NO | | N | || Index_priv | enum(‘N‘,‘Y‘) | NO | | N | || Alter_priv | enum(‘N‘,‘Y‘) | NO | | N | || Show_db_priv | enum(‘N‘,‘Y‘) | NO | | N | || Super_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_tmp_table_priv | enum(‘N‘,‘Y‘) | NO | | N | || Lock_tables_priv | enum(‘N‘,‘Y‘) | NO | | N | || Execute_priv | enum(‘N‘,‘Y‘) | NO | | N | || Repl_slave_priv | enum(‘N‘,‘Y‘) | NO | | N | || Repl_client_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_view_priv | enum(‘N‘,‘Y‘) | NO | | N | || Show_view_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_routine_priv | enum(‘N‘,‘Y‘) | NO | | N | || Alter_routine_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_user_priv | enum(‘N‘,‘Y‘) | NO | | N | || Event_priv | enum(‘N‘,‘Y‘) | NO | | N | || Trigger_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_tablespace_priv | enum(‘N‘,‘Y‘) | NO | | N | || ssl_type | enum(‘‘,‘ANY‘,‘X509‘,‘SPECIFIED‘) | NO | | | ssl_cipher | blob | NO | | NULL | || x509_issuer | blob | NO | | NULL | || x509_subject | blob | NO | | NULL | || max_questions | int(11) unsigned | NO | | 0 | || max_updates | int(11) unsigned | NO | | 0 | || max_connections | int(11) unsigned | NO | | 0 | || max_user_connections | int(11) unsigned | NO | | 0 | || plugin | char(64) | YES | | mysql_native_password | || authentication_string | text | YES | | NULL | || password_expired | enum(‘N‘,‘Y‘) | NO | | N | |+------------------------+-----------------------------------+------+-----+----------------
db表
1. 使用者被允許串連了,但是是不是可以就能操作所有資料庫了呢?
2. 所以我們需要db表/host表,用來規定某一個使用者對一個資料庫的許可權
3. db表的欄位分為兩類:
(1)使用者列
Host主機名稱、Db資料庫名、User使用者名稱
(2)許可權列
使用者是先根據user表的內容獲得許可權,再根據db表的內容擷取許可權
例如,user表中某使用者的Select_priv欄位為‘N’,表示所有資料庫中的表它都無權查詢
但db表中這一使用者對student表的Select_priv欄位設為了‘Y’,表示它只有查詢student表的許可權
desc db;+-----------------------+---------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------------------+---------------+------+-----+---------+-------+| Host | char(60) | NO | PRI | | || Db | char(64) | NO | PRI | | || User | char(16) | NO | PRI | | || Select_priv | enum(‘N‘,‘Y‘) | NO | | N | || Insert_priv | enum(‘N‘,‘Y‘) | NO | | N | || Update_priv | enum(‘N‘,‘Y‘) | NO | | N | || Delete_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_priv | enum(‘N‘,‘Y‘) | NO | | N | || Drop_priv | enum(‘N‘,‘Y‘) | NO | | N | || Grant_priv | enum(‘N‘,‘Y‘) | NO | | N | || References_priv | enum(‘N‘,‘Y‘) | NO | | N | || Index_priv | enum(‘N‘,‘Y‘) | NO | | N | || Alter_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_tmp_table_priv | enum(‘N‘,‘Y‘) | NO | | N | || Lock_tables_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_view_priv | enum(‘N‘,‘Y‘) | NO | | N | || Show_view_priv | enum(‘N‘,‘Y‘) | NO | | N | || Create_routine_priv | enum(‘N‘,‘Y‘) | NO | | N | || Alter_routine_priv | enum(‘N‘,‘Y‘) | NO | | N | || Execute_priv | enum(‘N‘,‘Y‘) | NO | | N | || Event_priv | enum(‘N‘,‘Y‘) | NO | | N | || Trigger_priv | enum(‘N‘,‘Y‘) | NO | | N | |+-----------------------+---------------+------+-----+---------+-------+
tables_priv表和columns_priv表
1. 同理,即便使用者有權對某一資料庫操作,那麼是不是對所有表都可以操作?對錶中的所有記錄都可以操作?
2. tables_priv表用來對單個表進行使用權限設定
3. columns_priv表用來對單條記錄(列)進行使用權限設定
4. 其包含的欄位主要有:
Host 主機名稱
Db 資料庫名
User 使用者名稱
Table_name表名
Table_priv對錶進行操作的許可權(select,insert,update,delete,create,drop,grant,references,index,alter)
Column_priv對記錄進行操作的許可權(select,insert,update,references)
Timestamp修改許可權的時間
Grantor 許可權的設定者
使用者的許可權分配規則
(1)Mysql的許可權分配是按照user表--->db表--->tables_priv表--->columns_priv表的順序進行分配的
(2)如果user表中某一許可權的值為Y,就不許要檢查往後的表了
(3)如果user表中某一許可權的值為N,則一次往後檢查每一張表
Mysql——許可權管理