創建用戶
USE mysql; #創建用戶需要操作 mysql 表
# 語法格式為 [@'host'] host 為 'localhost' 表示本地登錄用戶,host 為 IP地址或 IP 地址區間,表示指定IP地址的主機可登錄,host 為 "%",表示所有主機都可登錄,省略代表所有主機
CREATE USER 'username'[@'host'] IDENTIFIED BY 'password';
# eg. 常見 local_user 用戶可以在所有主機登錄,密碼為 123456
CREATE USER 'local_user' IDENTIFIED BY '123456';
# eg. 創建 local_user 只允許在本地登錄
CREATE USER 'local_user'@'localhost' IDENTIFIED BY '123456';
查看用戶權限
# 可以通過查詢 user 表獲取 語法格式為
SELECT privileges|* FROM user WHERE `user` = 'username';
# eg. 查看 local_user 的權限
SELECT * FROM user WHERE `user` = 'local_user';
# 也可以用 SHOW GRANTS 查看
SHOW GRANTS FOR 'username' [@host];
# eg.
SHOW GRANTS FOR local_user;
賦予用戶權限
# 語法格式
GRANT privileges ON database.table TO 'username'@'host' [IDENTIFIED BY 'password'];
# eg. 賦予 local_user 在所有主機的所有權限,但不包含給其他賬號賦予權限的權限
GRANT all ON *.* TO 'local_user'@'%';
# 刷新權限 權限更新后刷新才會起作用
FLUSH PRIVILEGES;
- GRANT命令說明:
- priveleges (權限列表),可以是
all, 表示所有權限,也可以是select,update等權限,多個權限的名詞,相互之間用逗號分開。
- ON 用來指定權限針對哪些庫和表。格式為
數據庫 .表名 ,點號前面用來指定數據庫名,點號后面用來指定表名,*.* 表示所有數據庫所有表。
- TO 表示將權限賦予某個用戶, 格式為
username@host,@前面為用戶名,@后面接限制的主機,可以是IP、IP段、域名以及%,%表示任何地方。注意:這里%有的版本不包括本地,以前碰到過給某個用戶設置了%允許任何地方登錄,但是在本地登錄不了,這個和版本有關系,遇到這個問題再加一個localhost的用戶就可以了。
- IDENTIFIED BY 指定用戶的登錄密碼,該項可以省略(某些版本下回報錯,必須省略)。
- WITH GRANT OPTION 這個選項表示該用戶可以將自己擁有的權限授權給別人。注意:經常有人在創建操作用戶的時候不指定WITH GRANT OPTION選項導致后來該用戶不能使用GRANT命令創建用戶或者給其它用戶授權。
備注:可以使用GRANT重復給用戶添加權限,權限疊加,比如你先給用戶添加一個select權限,然后又給用戶添加一個insert權限,那么該用戶就同時擁有了select和insert權限。
- 授權原則說明:
- 只授予能滿足需要的最小權限,防止用戶干壞事。比如用戶只是需要查詢,那就只給select權限就可以了,不要給用戶賦予update、insert或者delete權限。
- 創建用戶的時候限制用戶的登錄主機,一般是限制成指定IP或者內網IP段。
- 初始化數據庫的時候刪除沒有密碼的用戶。安裝完數據庫的時候會自動創建一些用戶,這些用戶默認沒有密碼。
- 為每個用戶設置滿足密碼復雜度的密碼。
- 定期清理不需要的用戶。回收權限或者刪除用戶。
收回用戶權限
# 語法格式
REVOKE privileges ON database.table FROM 'username'@'host';
# eg. 收回 local_user 的寫入和更新權限
REVOKE insert,update ON *.* FROM 'local_user'@'%';
刪除用戶
# 語法格式
DROP USER 'username'@'host';
# eg. 刪除本地用戶 local_user
DROP USER 'local_user'@'localhost';