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