MySQL訪問控制和用戶管理

訪問控制

  你須要給用戶提供他們所需的訪問權,且僅提供他們所需的訪問權。這就是所謂的訪問控制,管理訪問控制須要建立和管理用戶帳號。mysql

  • 多數用戶只須要對錶進行讀和寫,但少數用戶甚至須要能建立和刪除表;
  • 某些用戶須要讀表,但可能不須要更新表;
  • 你可能想容許用戶添加數據,但不容許他們刪除數據;
  • 某些用戶(管理員)可能須要處理用戶帳號的權限,但多數用戶不須要;
  • 你可能想讓用戶經過存儲過程訪問數據,但不容許他們直接訪問數據;
  • 你可能想根據用戶登陸的地點限制對某些功能的訪問。

  不要使用root 應該嚴肅對待root登陸的使用。僅在絕對須要時使用它(或許在你不能登陸其餘管理帳號時使用)。不該該在平常的MySQL操做中使用root。sql

管理用戶

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要求你至少給出如下信息:session

  • 要授予的權限;
  • 被授予訪問權限的數據庫或表;
  • 用戶名。
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可在幾個層次上控制訪問權限:ui

  • 整個服務器,使用GRANT ALL和REVOKE ALL;
  • 整個數據庫,使用ON database.*;
  • 特定的表,使用ON database.table;
  • 特定的列;
  • 特定的存儲過程。

列出能夠授予或撤銷的每一個權限。this

權 限 說 明
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更新當前登陸用戶的口令。
相關文章
相關標籤/搜索