訪問控制
你需要給用戶提供他們所需的訪問權,且僅提供他們所需的訪問權。這就是所謂的訪問控制,管理訪問控制需要創建和管理用戶賬號。
- 多數用戶只需要對錶進行讀和寫,但少數用戶甚至需要能創建和刪除表;
- 某些用戶需要讀表,但可能不需要更新表;
- 你可能想允許用戶添加數據,但不允許他們刪除數據;
- 某些用戶(管理員)可能需要處理用戶賬號的權限,但多數用戶不需要;
- 你可能想讓用戶通過存儲過程訪問數據,但不允許他們直接訪問數據;
- 你可能想根據用戶登錄的地點限制對某些功能的訪問。
不要使用root 應該嚴肅對待root登錄的使用。僅在絕對需要時使用它(或許在你不能登錄其他管理賬號時使用)。不應該在日常的MySQL操作中使用root。
管理用戶
mysql> USE mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> SELECT user FROM user;
+------------------+
| user |
+------------------+
| debian-sys-maint |
| mysql.infoschema |
| mysql.session |
| mysql.sys |
| root |
+------------------+
5 rows in set (0.00 sec)
- mysql數據庫有一個名爲user的表,它包含所有用戶賬號。user表有一個名爲user的列,它存儲用戶登錄名。
創建用戶賬號
mysql> CREATE USER ben IDENTIFIED BY 'p@$$w0rd';
Query OK, 0 rows affected (0.06 sec)
-
CREATE USER創建一個新用戶賬號。在創建用戶賬號時不一定需要口令。
-
指定散列口令 IDENTIFIED BY指定的口令爲純文本,MySQL將在保存到user表之前對其進行加密。爲了作爲散列值指定口令,使用IDENTIFIED BY PASSWORD。
-
使用GRANT或INSERT GRANT語句(稍後介紹)也可以創建用戶賬號,但一般來說CREATE USER是最清楚和最簡單的句子。此外,也可以通過直接插入行到user表來增加用戶,不過爲安全起見,一般不建議這樣做。MySQL用來存儲用戶賬號信息的表(以及表模式等)極爲重要,對它們的任何毀壞都可能嚴重地傷害到MySQL服務器。因此,相對於直接處理來說,最好是用標記和函數來處理這些表。
重命名賬戶
mysql> RENAME USER ben TO bforta;
Query OK, 0 rows affected (0.01 sec)
- MySQL 5之前 僅MySQL 5或之後的版本支持RENAME USER。爲了在以前的MySQL中重命名一個用戶,可使用UPDATE直接更新user表。
刪除用戶賬號
mysql> DROP USER bforta;
Query OK, 0 rows affected (0.00 sec)
- 在MySQL 5以前,DROP USER只能用來刪除用戶賬號,不能刪除相關的權限。因此,如果使用舊版本的MySQL,需要先用REVOKE刪除與賬號相關的權限,然後再用DROP USER刪除賬號。
設置訪問權限
SHOW GRANTS FOR username@localhost;
- 爲看到賦予用戶賬號的權限,使用SHOW GRANTS FOR。
- 用戶定義爲user@host MySQL的權限用用戶名和主機名結合定義。如果不指定主機名,則使用默認的主機名%(授予用戶訪問權限而不管主機名)。
爲設置權限,使用GRANT語句。GRANT要求你至少給出以下信息:
- 要授予的權限;
- 被授予訪問權限的數據庫或表;
- 用戶名。
GRANT SELECT ON crashcourse.* TO bforta;
- 此GRANT允許用戶在crashcourse.*(crashcourse數據庫的所有表)上使用SELECT。通過只授予SELECT訪問權限,用戶bforta對crashcourse數據庫中的所有數據具有隻讀訪問權限。
GRANT的反操作爲REVOKE,用它來撤銷特定的權限。
REVOKE SELECT ON crashcourse.* FROM bforta;
- 這條REVOKE語句取消剛賦予用戶bforta的SELECT訪問權限。被撤銷的訪問權限必須存在,否則會出錯。
GRANT和REVOKE可在幾個層次上控制訪問權限:
- 整個服務器,使用GRANT ALL和REVOKE ALL;
- 整個數據庫,使用ON database.*;
- 特定的表,使用ON database.table;
- 特定的列;
- 特定的存儲過程。
列出可以授予或撤銷的每個權限。
權 限 | 說 明 |
---|---|
ALL | 除GRANT OPTION外的所有權限 |
ALTER | 使用ALTER TABLE |
ALTER ROUTINE | 使用ALTER PROCEDURE和DROP PROCEDURE |
CREATE | 使用CREATE TABLE |
CREATE ROUTINE | 使用CREATE PROCEDURE |
CREATE TEMPORARY TABLES | 使用CREATE TEMPORARY TABLE |
CREATE USER | 使用CREATE USER、DROP USER、RENAME USER和REVOKE ALL PRIVILEGES |
CREATE VIEW | 使用CREATE VIEW |
DELETE | 使用DELETE |
DROP | 使用DROP TABLE |
EXECUTE | 使用CALL和存儲過程 |
FILE | 使用SELECT INTO OUTFILE和LOAD DATA INFILE |
GRANT OPTION | 使用GRANT和REVOKE |
INDEX | 使用CREATE INDEX和DROP INDEX |
INSERT | 使用INSERT |
LOCK TABLES | 使用LOCK TABLES |
PROCESS | 使用SHOW FULL PROCESSLIST |
RELOAD | 使用FLUSH |
REPLICATION CLIENT | 服務器位置的訪問 |
REPLICATION SLAVE | 由複製從屬使用 |
SELECT | 使用SELECT |
SHOW DATABASES | 使用SHOW DATABASES |
SHOW VIEW | 使用SHOW CREATE VIEW |
SHUTDOWN | 使用mysqladmin shutdown(用來關閉MySQL) |
SUPER | 使用CHANGE MASTER、KILL、LOGS、PURGE、MASTER和SET GLOBAL。還允許mysqladmin調試登錄 |
UPDATE | 使用UPDATE |
USAGE | 無訪問權限 |
- 未來的授權 在使用GRANT和REVOKE時,用戶賬號必須存在,但對所涉及的對象沒有這個要求。這允許管理員在創建數據庫和表之前設計和實現安全措施。這樣做的副作用是,當某個數據庫或表被刪除時(用DROP語句),相關的訪問權限仍然存在。而且,如果將來重新創建該數據庫或表,這些權限仍然起作用。
- 簡化多次授權 可通過列出各權限並用逗號分隔,將多條GRANT語句串在一起
更改口令
mysql> SET PASSWORD FOR bforta=PASSWORD ('P@ssW0rd');
Query OK, 0 rows affected (0.01 sec)
-
SET PASSWORD更新用戶口令。新口令必須傳遞到Password()函數進行加密。
-
SET PASSWORD還可以用來設置你自己的口令
mysql> SET PASSWORD =PASSWORD ('P@ssW0rd');
Query OK, 0 rows affected (0.01 sec)
- 在不指定用戶名時,SET PASSWORD更新當前登錄用戶的口令。