MySQL 新增用戶主要有兩種方式:GRANT 語句(推薦,語法簡潔、錯誤率低)與 直接操作授權表(需手動 FLUSH PRIVILEGES)。本文以實戰範例詳細說明兩種做法的完整流程與注意事項。
root 身分連線root 擁有 mysql 資料庫的 INSERT 權限與 RELOAD 管理權限GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'something' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO monty@"%" IDENTIFIED BY 'something' WITH GRANT OPTION;
GRANT RELOAD, PROCESS ON *.* TO admin@localhost;
GRANT USAGE ON *.* TO dummy@localhost;
用戶說明:
monty:全權限超級用戶,可從任意主機連線,需密碼。須同時建立 @localhost 與 @"%" 兩條記錄,否則匿名用戶優先權較高會導致本機連線失敗。admin:僅具 RELOAD、PROCESS 管理權限,無資料庫操作權限,本機免密登入。dummy:僅具 USAGE(連線權限),本機免密登入,後續再授予具體資料庫權限。需求:custom 從 localhost、server.domain、whitehouse.gov 連線,密碼 stupid,分別存取 bankaccount、expenses、customer 三庫。
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO custom@localhost IDENTIFIED BY 'stupid';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO custom@whitehouse.gov IDENTIFIED BY 'stupid';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO custom@'%' IDENTIFIED BY 'stupid';
同樣建立上述三用戶:
INSERT INTO user VALUES('localhost','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
INSERT INTO user VALUES('%','monty',PASSWORD('something'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
INSERT INTO user SET Host='localhost', User='admin', Reload_priv='Y', Process_priv='Y';
INSERT INTO user (Host,User,Password) VALUES('localhost','dummy','');
FLUSH PRIVILEGES;
注意: MySQL 版本不同,user 表權限欄位數量不同(3.22.11 前較少),需對應調整 Y 數量。admin 使用 SET 語法需 3.22.11+ 版本。
INSERT INTO user (Host,User,Password) VALUES('localhost','custom',PASSWORD('stupid'));
INSERT INTO user (Host,User,Password) VALUES('server.domain','custom',PASSWORD('stupid'));
INSERT INTO user (Host,User,Password) VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv)
VALUES ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv)
VALUES ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv)
VALUES ('%','customer','custom','Y','Y','Y','Y','Y','Y');
FLUSH PRIVILEGES;
前三條建立連線帳號(權限全為 N),後三條在 db 表授予具體庫權限。修改授權表後必須執行 FLUSH PRIVILEGES 才生效。
允許某網域所有主機:GRANT ... TO user@"%.mydomain.com" 或 INSERT INTO user VALUES ('%.mydomain.com', ...)。
亦可使用 xmysqladmin、mysql_webadmin、xmysql(位於 MySQL Contrib 目錄)進行視覺化授權管理。