10、MySQL权限控制实现原理
MySQL 權限表在數(shù)據(jù)庫啟動時載入內存,用戶通過身份認證后,系統(tǒng)會在內存中進行相應權限的存取。當 MySQL 允許一個用戶執(zhí)行各種操作時,它將首先核實該用戶向 MySQL 服務器發(fā)送的連接請求,然后確認用戶的操作請求是否被允許。
當用戶進行連接時,MySQL 實現(xiàn)權限控制主要有以下兩個階段:
1)連接核實階段
登錄 MySQL 服務器時,客戶端連接請求中會提供用戶名稱、主機地址和密碼,MySQL 服務器會使用 user 表中的 Host、User 和 authentication_string (MySQL 5.7 版本之前是 Password)字段執(zhí)行身份檢查。
只有客戶端請求的主機名和用戶名在 user 表中有匹配的記錄,并且密碼正確時,MySQL 服務器才會通過身份認證,接受連接,否則拒絕連接。
MySQL 通過 IP 地址和用戶名聯(lián)合進行身份認證。例如 MySQL 安裝后默認創(chuàng)建的用戶 root@localhost,表示用戶 root 只能從本地(localhost)進行連接時才能通過認證。此用戶從其它任何主機對數(shù)據(jù)庫進行連接時都將被拒絕。也就是說,用戶名相同,IP 地址不同,MySQL 則將其視為不同的用戶。
服務器接受連接后進入請求核實階段等待用戶請求。如果連接核實沒有通過,服務器則完全拒絕訪問。
2)請求核實階段
建立連接后,服務器進入請求核實階段,對在此連接上的每個請求,服務器都會檢查用戶是否有足夠的權限來執(zhí)行它。這正是授權表中的權限列發(fā)揮作用的地方。
權限按照以下權限表的順序得到數(shù)據(jù)庫權限:user→db→tables_priv→columns_priv→procs_priv。在這幾個權限表中,權限范圍依次遞減,全局權限覆蓋局部權限。
請求核實的過程如下所示:
1)用戶向 MySQL 發(fā)出操作請求。
2)MySQL 首先檢查 user 表,匹配 User、Host 字段值,查看請求的全局權限在 user 表中是否被授權。授權則允許操作執(zhí)行,如果指定的權限在 user 表中沒有被授權。MySQL 將檢查 db 表。
3)db 表是下一安全層級,其中的權限限定于數(shù)據(jù)庫層級,在該層級的 SELECT 權限允許用戶查看指定數(shù)據(jù)庫的所有表中的數(shù)據(jù)。
MySQL 檢查 db 權限表中的權限信息,匹配 User、Host 字段值,查看請求的數(shù)據(jù)庫級別的權限在 db 表中是否被授權。授權則允許操作執(zhí)行,否則 MySQL 繼續(xù)向下查找。
4)MySQL 檢查 tables_priv 權限表中的權限信息,匹配 User、Host 字段值,查看請求的數(shù)據(jù)表級別的權限在 tables_priv 表中是否被授權。授權則允許操作執(zhí)行,否則 MySQL 繼續(xù)向下查找。
5)MySQL 檢查 columns_priv 權限表中的權限信息,匹配 User、Host 字段值,查看請求的列級別的權限在 columns_priv 表中是否被授權。授權則允許操作執(zhí)行,否則 MySQL 繼續(xù)向下查找。
6)如果所有權限表都檢查完畢,還是沒有找到允許的權限操作,那么 MySQL 將返回錯誤信息,即用戶請求的操作不能執(zhí)行,操作失敗。
提示:上面提到 MySQL 通過向下層級的順序檢查權限表,但并不意味著所有的權限都要執(zhí)行該過程。例如,一個用戶登錄到 MySQL 服務器之后只執(zhí)行對 MySQL 的管理操作,此時只涉及管理權限,因此 MySQL 只檢查 user 表。
總結
以上是生活随笔為你收集整理的10、MySQL权限控制实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9、 root修改普通用户密码
- 下一篇: 1、数据库为什么需要备份?