mysql權限控制在不同的上下文和不同的操作水平上都可以進行控制,他們包括如下幾個
** 管理權限可以允許用戶管理mysql server的操作。這些權限控制是全局的,不是針對某個特定的數據庫的
** 數據庫權限對應到一個數據庫和裡面的對象。這些權限被用來控制特定的數據庫或者全局的,他們能夠應用到所有的數據庫
** 數據庫對象的權限對應到數據庫表,索引,視圖,和存儲過程,可以對數據庫內部的某個對象進行授權控制。
** 賬號權限信息被存儲在mysql數據庫的user,db,tables_priv ,columns_priv ,procs_priv 表中。
** mysql啟動的時候讀取這些信息到內存中去,或者在權限變更生效的時候,重新讀取到內存中去
mysql 賬號名字由用戶名和主機名組成。這樣可以允許同已用戶在不同主機上分別控制權限。這一部分描述如何分配賬戶名字包括特定的值和模糊
匹配規則,在sql語句中,create user, grant ,set password的時候,會用到這些規則:
- ‘user_name’@’host_name’ 就是賬戶名字的語法規則
- 僅僅包含用戶名的賬號等同於 ‘username’@’%’
- 如果用戶名是合法的字符,用戶名和主機名不必用引號引起來。在你的用戶名包含’-‘這樣的字符的時候,需要用引號引起來。或者說主機名有
通配符的時候需要引起來。
- 引號可以用單引號也可以用雙引號。
- 主機和用戶名必須分別被引號括起來,如果必須要括的話。
mysql在mysql數據庫中分別用兩個列去存儲用戶名和主機名:
- 用戶表每個賬戶一行記錄,次表也表示了賬號有哪些全局權限。
- 其他授權表表示了賬號擁有的數據庫和數據庫內的對象。這些表都有用戶名和主機列。每行的賬戶信息和user表的賬戶信息是奕揚的。
用戶名和主機名可以包含特殊字符或者通配符,下面是這些規則:
用戶名要麼是一個非空字符串字面上必須匹配連接字符串中指名的用戶名,或者一個空字符串就會匹配人戶用戶名。空用戶名是一個匿名用戶。
主機名也可以又好多形式,或者通配符:
- 主機名可以是一個IP地址或者一個localhost樣的字符串。
- %和sql中的like的效果是一樣的。例如 ’%.mysql.com’ 就會匹配 a.mysql.com.
當你嘗試去連接到mysql服務器,服務器基於下面兩點條件去接受或者拒絕連接:
- 你的身份標識以及正確的密碼
- 你的賬號是否被鎖定了
服務器先校驗密碼是否正確,然後校驗是否鎖定。任何一個步驟失敗,服務器將會拒絕連接。如果通過教研,服務器接受連接,然後進入第二階段
並且等候請求。
認證檢查線檢查user表的三個列,host,user,password。鎖定狀態是在user表的account_locked列中記錄著的。賬號鎖定狀態可以通過alter user
語句來變更。
你的身份由兩部分來組成,你連接的客戶主機以及你的mysql用戶名。如果用戶名不空,則必須全字符匹配才可以,如果用戶名是空的,則匹配
任何用戶。如果用戶表匹配到一個空用戶名,這個用戶被認為是一個匿名用戶,二不是客戶實際提供的。這意味著空用戶名是用來進一步檢查用的
也就是階段2.
密碼可以為空,這個不是一個通配符,不意味著匹配任何密碼。它的意思是用戶必須無密碼連接。如果服務起授權一個客戶都安使用一個插件,這樣
該插件實現的認證體系或許沒有用密碼列。在這樣的情況下,外部密碼也可以用來去認證mysql服務器。
非空密碼都是加密存儲的,mysql沒有存儲任何明文密碼。並且,用戶提供的密碼也是被加密的。這個加密的密碼後來在連接過程中,來檢查密碼是
否正確。
從mysql的觀點來看,加密的密碼才是真正的密碼,所以不要告訴任何人這個加密的密碼。
如果在user表中有多行被匹配,服務器必須決定用哪一個,它的規則是這樣的:
- 任何時候服務器讀取用戶表到內存中的時候,它會排序。
- 服務器檢查的伺候服務器按行順序去檢查
- 服務器使用第一個匹配的行
服務器排序的規則是字面的在前面,統配的在後面。
當通過了連接校驗,你和服務器建立了連接後,服務器進入權限控制的第二個階段。你的每個請求,服務器決定出你想做什麼操作,然後檢查你是否有
權限去做。此時,grant 表的privilege列就該出場了。這些列可以出自 user,db,tables_priv,columns_priv,procs_priv。不再細講這些表了。
當服務器啟動的時候,grant表的數據被讀入內存。如果你使用賬戶管理語句去更新權限控制,服務器將會知道這些變更,然後重新讀取它們。如果你
直接用sql語句去更新這些表,你的變更不會生效知道你重新啟動服務器或者你告訴服務器去重建緩存。
你可以通過執行一個刷新權限操作來通知服務器重建緩存。下面三個語句都可以達到效果:
- flush_privileges
- mysqladmin_flush-privileges
- mysqladmin_reload
如果啟動參數是 –skip-grant-tables ,那麼服務器不再校驗任何權限,很不安全。