在MySQL數據庫中,權限訪問控制實際上有兩大模塊。
第一:用戶管理模塊
第二:用戶訪問動做控制模塊,用戶訪問動做最多見就是DML,DDLmysql
其中用戶管理模塊的做用,就是驗證用戶可否合法登陸mysql數據庫,而用戶訪問動做控制模塊,則控制這合法用戶能作動做。sql
其實這麼說仍是有些抽象,那來看看mysql數據庫中關於權限訪問控制的4張表。數據庫
mysql.user mysql.db mysql.tables_priv mysql.columns_priv
用戶管理模塊由mysql.user控制,用戶訪問動做控制模塊由mysql.db,mysql.tables_priv,mysql.columns_priv三張表一塊兒控制。ide
其權限驗證大概流程以下所示spa
舉一個select語句的例子code
select id,name from test.t4 where status='delete'
用戶要執行這個select語句整個流程
第一步:應用首先須要鏈接mysql數據庫,鏈接時驗證host,user,password,若是不知足,則鏈接被拒絕,例如:用戶名不正確,密碼不正確,host主機被限制在特殊網段(192.168.2.%),或者限制本地登陸(localhost)blog
第二步:驗證global級別是否有select權限,即驗證mysql.user表中的select權限,若是Select_priv爲Y,則不作後續驗證ip
mysql> select * from mysql.user where user='abc'\G; *************************** 1. row *************************** Host: % User: abc Select_priv: N Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Reload_priv: N Shutdown_priv: N Process_priv: N File_priv: N Grant_priv: N References_priv: N Index_priv: N Alter_priv: N Show_db_priv: N Super_priv: N Create_tmp_table_priv: N Lock_tables_priv: N Execute_priv: N Repl_slave_priv: N Repl_client_priv: N Create_view_priv: N Show_view_priv: N Create_routine_priv: N Alter_routine_priv: N Create_user_priv: N Event_priv: N Trigger_priv: N Create_tablespace_priv: N ssl_type: ssl_cipher: x509_issuer: x509_subject: max_questions: 0 max_updates: 0 max_connections: 0 max_user_connections: 0 plugin: mysql_native_password authentication_string: *0D3CED9BEC10A777AEC23CCC353A8C08A633045E password_expired: N password_last_changed: 2020-09-01 00:52:37 password_lifetime: NULL account_locked: N 1 row in set (0.00 sec)
第三步:驗證db級別select權限,若是有,則後續不驗證ssl
mysql> select * from mysql.db where user='abc'\G; *************************** 1. row *************************** Host: % Db: test User: abc Select_priv: Y Insert_priv: N Update_priv: N Delete_priv: N Create_priv: N Drop_priv: N Grant_priv: N References_priv: N Index_priv: N Alter_priv: N Create_tmp_table_priv: N Lock_tables_priv: N Create_view_priv: N Show_view_priv: N Create_routine_priv: N Alter_routine_priv: N Execute_priv: N Event_priv: N Trigger_priv: N 1 row in set (0.00 sec)
第四步:驗證表級別權限,若是有,則後續不驗證ci
mysql> select * from mysql.tables_priv where user='abc'\G; *************************** 1. row *************************** Host: % Db: test User: abc Table_name: t4 Grantor: root@localhost Timestamp: 0000-00-00 00:00:00 Table_priv: Select Column_priv: 1 row in set (0.00 sec)
第五步:驗證列級別權限,若是有,則後續不驗證
mysql> select * from columns_priv; +------+------+------+------------+-------------+---------------------+-------------+ | Host | Db | User | Table_name | Column_name | Timestamp | Column_priv | +------+------+------+------------+-------------+---------------------+-------------+ | % | test | abc | t4 | id | 0000-00-00 00:00:00 | Select | | % | test | abc | t4 | name | 0000-00-00 00:00:00 | Select | | % | test | abc | t4 | status | 0000-00-00 00:00:00 | Select | +------+------+------+------------+-------------+---------------------+-------------+ 3 rows in set (0.00 sec)
若是以上都驗證都經過,則拒接執行select語句,上述詳細流程圖以下所示
這個mysql權限訪問控制內幕,你get了吧。