簡體   English   中英

MySQL/MariaDB:“GRANT ... IDENTIFIED BY”與“CREATE USER”和“GRANT”之間有什么區別?

[英]MySQL/MariaDB: What is the difference between 'GRANT … IDENTIFIED BY' vs 'CREATE USER' and then 'GRANT'?

設置數據庫時,我通常會創建一個用戶:

CREATE USER myuser@localhost IDENTIFIED BY 'pa$$w0rd';

然后給用戶一些對數據庫的權限:

GRANT SELECT, INSERT, UPDATE ON dbname.* TO 'myuser'@'localhost' IDENTIFIED BY 'pa$$w0rd';

我看到這兩個命令序列到處都是這樣做的方法。 但是,我注意到如果我跳過CREATE USER命令並從GRANT開始,用戶似乎是自動創建的並且工作正常。 是否有理由在GRANT之前仍然使用CREATE USER 或者它只是一個舊的約定,也許是為了向后兼容?

MySQL 過去僅通過向用戶授予權限來支持隱式創建用戶。 這種用法使 GRANT 具有冪等性和復制安全性。 例如,當用戶可能存在或不存在於副本上時,如果用戶不存在,則 GRANT 將創建該用戶。 如果用戶確實存在,那么 GRANT 仍然有效,並在需要時添加權限。

當以這種方式使用 GRANT 時,可以選擇使用 IDENTIFIED BY 子句來設置密碼。 如果用戶已經存在,則不需要 IDENTIFIED BY,因為用戶已經有密碼。 如果用戶不存在,則省略 IDENTIFIED BY 將隱式創建用戶,但沒有密碼(即任何人都可以在不輸入密碼的情況下以該用戶身份登錄)。

這被認為是一種安全風險。 例如,如果有人在沒有 IDENTIFIED BY 的情況下使用 GRANT,並且在用戶名上拼寫錯誤,那么可能會意外創建一個具有特權但沒有密碼的新用戶。

GRANT ALL ON *.* TO 'ruhnett'@'%';  -- misspelled username creates new user

這將允許任何人以新用戶身份登錄並獲得特權訪問。

因此,在 MySQL 5.7 中,不推薦使用 GRANT 隱式創建用戶。

CREATE USER ... IF NOT EXISTS 語法代替冪等用戶創建。 這鼓勵開發人員更明確地了解何時要創建用戶以及何時要向現有用戶授予權限。

你在做什么在 MySQL 8.0 中不起作用。 GRANT命令中自動創建用戶的功能已被刪除,您必須先使用CREATE USER

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM