哪些用戶可以連接到MariaDB 服務器,他們都可以從哪些地方連接,連接到服務器后又能夠做什么等,都是本文將涉及到的內容。
用戶的權限信息都保存在 mysql 庫中的幾個權限表中。對 MariaDB 的賬號管理主要通過下面的SQL 語句來完成。
- CREATE USER,DROP USER 和 RENAME USER。三條語句分別用來創建、刪除和重命名 MariaDB 賬戶。
- GRANT。為指定 MariaDB 賬戶分配權限。
- REVOKE。撤銷指定 MariaDB 賬戶的權限。
- SET PASSWORD。為給定MariaDB 賬戶設置口令。
- SHOW GRANT。顯示指定 MariaDB賬戶當前擁有的全部權限。
Mariadb 的賬戶管理操作
- CREATE USER:創建一個新賬戶並為其設置一個口令(可選操作):
CREATE USER account [IDENTIFIED BY ‘password’];
這條語句只是創建帳戶,未對帳戶進行任何權限分配,權限分配由 GRANT 語句完成。
示例:MariaDB [(none)]> CREATE USER yangfan IDENTIFIED BY 'yangfan'; - DROP USER:刪除一個帳戶及與之相關的全部權限:
DROP USER account;
該語句並未刪除指定用戶可訪問到的任何數據庫及相關的數據對象。
示例:MariaDB [(none)]> DROP USER yangfan; - RENAME USER:改變給定賬戶的名稱。
RENAME USER from_account TO to_account
示例:MariaDB [(none)]> RENAME USER 'yangfan.lalala'@'127.0.0.1' TO 'yangfan.lalala'@'%';
CREATE USER 等賬戶管理語句中的賬戶由一個用戶名和一個主機名組成,其格式為‘user_name’@’host_name’。
主機部分是指客戶從哪些主機去連接服務器。如若限制某個用戶從指定的主機連接 MariaDB 服務:
MariaDB [(none)]> CREATE USER 'yangfan'@'localhost' IDENTIFIED BY 'yangfan';
MariaDB [(none)]> CREATE USER 'yangfan'@'169.254.195.91' IDENTIFIED BY 'yangfan';
第一條語句,創建一個名為 yangfan 的用戶,並限制其只可從本機進行連接操作;第二條一句,創建一個名為 yangfan 的用戶,並限制其只可從 ip 169.254.195.91 的客戶機上連接服務。雖然用戶名相同,實際上,他們並不是同一個賬戶,其對應的權限也可能不盡相同。
當然很多情況下並不需要嚴格要求用戶只能從一台主機連接服務器。這個時候就可以用上通配符:
MariaDB [(none)]> CREATE USER 'yangfan'@'169.254.195.%' IDENTIFIED BY 'yangfan';
MariaDB [(none)]> CREATE USER 'yangfan'@'%.yangfanweb.cn' IDENTIFIED BY 'yangfan';
MariaDB [(none)]> CREATE USER 'yangfan'@'%' IDENTIFIED BY 'yangfan';
SQL 中 LIKE 的通配符 % 及 -,在此都可使用。如若使用 “%” 或 “-” 本身,則需使用 “\” 對其轉義。
上面第一條語句創建一個名為 yangfan 的用戶,並允許其在 169.254.195.* ip 段下的所有主機連接服務器;第二條語句創建一個名為 yangfan 的用戶,並允許其能夠從 yangfanweb.cn 域中的任意一台主機連接服務器;第三條語句創建了一個名為 yangfan 的用戶,並允許其可從任意一台主機來連接服務器。(第三種方式最為方便,但對系統最不安全。)
MariaDB 對賬戶授權
對賬戶授權需要使用GRANT語句,下面是 GRANT 語句的語法:
GRANT privileges (columns) ON what To account [IDENTIFIED BY ‘password’][REQUIRE encryption requirements] [WITH grant or resource management options];
GRANT 語句里,如果用戶存在,GRANT 語句則將改變它的權限;如果不存在 GRANT 語句則創建它,再將給定的權限分配給它。
下面是 GRANT 語句最為常用的幾個語法元素。
- privileges,授權賬戶的權限。
- columns,權限將作用的數據列。如若需要列舉多個數據列,則用逗號分隔。
- what,權限的級別。
- account,被授權的賬戶。account 的格式為 ‘user_name’@’host_name’。
- password,賬戶的口令。類似於 CREATE USER 中的 IDENTIED BY。
確定賬戶的權限
可以授予用戶的權限由很多種。下面3張表即為權限的匯總。
| 數據庫管理權限 |
|
| 權限名 | 權限所允許的操作 |
| CREATE USER | 使用高級賬戶管理語句 |
| FILE | 讀、寫 MariaDB 服務器主機上的文件 |
| GRANT OPTION | 把賬戶權限授予其他賬戶 |
| PROCESS | 查看在運行的線程的信息 |
| RELOAD | 重新加載權限數據或更新日志及緩存 |
| REPLICATION CLIENT | 查詢主/從服務器的運行地點 |
| REPLICATION SLAVE | 以復制的從服務器運行 |
| SHOW DATBASES | 用 SHOW DATABASES 語句查看全部數據庫名稱 |
| SHUTDOWN | 關閉服務器 |
| SUPER | 用 KILL 命令終止線程以及進行其他超級用戶操作 |
| 數據庫對象操作權限 |
|
| ALTER | 更改數據表或索引的定義 |
| ALTER ROUTINE | 更改或刪除存儲函數或存儲過程 |
| CREATE | 創建數據庫或數據表 |
| CRATE ROUTINE | 創建存儲函數或存儲過程 |
| CREATE TEMPORARY TABLE | 用 TEMPORARY 關鍵字創建臨時表 |
| CREATE VIEW | 創建視圖 |
| DELETE | 刪除數據庫中現有的數據行 |
| DROP | 刪除數據庫、數據表或其他對象 |
| EVENT | 為時間調度程序創建、刪除或修改各種事件 |
| EXECUTE | 執行存儲函數或存儲過程 |
| INDEX | 創建或刪除索引 |
| INSERT | 往數據表中插入新數據行 |
| LOCK TABLE | 用 LOCK TABLE 語句明確地鎖定數據表 |
| REFERENCE | 未使用(保留字) |
| SELECT | 檢索數據表里的數據行 |
| SHOW VIEW | 查看視圖的定義 |
| TRGGER | 創建或刪除觸發器 |
| UPDATE | 修改數據行 |
| 其他權限 |
|
| ALL [PRIVILEGES] | 所有操作權限(但不包含 GRANT) |
| USAGE | 一個特殊的“無權限”權限 |
數據庫管理權限控制着服務器的運行情況,所以很少授權與普通用戶。數據庫對象操作權限控制着對服務器數據訪問。
授予用戶權限
要想把權限授予其他用戶,首先發出授權的用戶必須具備該權限,而且必須具備 GRANT OPTION 權限。
MariaDB 允許在數據庫系統全局、數據庫、數據表、數據列等多種級別上進行授權。權限級別由 ON 子句控制。
執行下面的語句:
MariaDB [(none)]> GRANT ALL ON test.* TO 'yangfan'@'localhost' WITH GRANT OPTION;
上面語句將數據庫test及其里面所有對象的所有權限授權於賬戶 ‘yangfan’@’localhost’。
MariaDB [(none)]> SHOW GRANTS FOR 'yangfan'@'localhost';
+----------------------------------------------------------------------------------------------------------------+
| Grants for yangfan@localhost |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'yangfan'@'localhost' IDENTIFIED BY PASSWORD '*F6131BD316F9043F5FE0E5B95F5713D6F86A157F' |
| GRANT ALL PRIVILEGES ON `test`.* TO 'yangfan'@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------+
執行以下語句:
MariaDB [(none)]> GRANT SELECT,INSERt,UPDATE ON test.* TO 'yangfan'@'127.0.0.1';
上面語句將賬戶 ‘yangfan’@’127.0.0.1’ 的權限更改為,只有對數據庫 test 及其里面所有對象進行 SELECT、INSERT 和 UPDATE 操作的權限。
MariaDB [(none)]> SHOW GRANTS FOR 'yangfan'@'127.0.0.1';
+----------------------------------------------------------------------------------------------------------------+
| Grants for yangfan@127.0.0.1 |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'yangfan'@'127.0.0.1' IDENTIFIED BY PASSWORD '*F6131BD316F9043F5FE0E5B95F5713D6F86A157F' |
| GRANT SELECT, INSERT, UPDATE ON `test`.* TO 'yangfan'@'127.0.0.1' |
+----------------------------------------------------------------------------------------------------------------+
撤銷用戶權限
撤銷用戶授權用 REVOKE 語句,下面是 REVOKE 語句的語法:
REVOKE preivileges [ columns ] ON what FROM account;
之前我們將全部權限授予賬戶 ‘yangfan’@’localhost’, 現在我們對該賬戶進行權限的刪除:
MariaDB [(none)]> REVOKE ALL ON test.* FROM 'yangfan'@'localhost';
這樣賬戶 ‘yangfan’@’localhost’ 對數據庫 test 的權限便被全部刪除了。
MariaDB [(none)]> SHOW GRANTS FOR 'yangfan'@'localhost';
+----------------------------------------------------------------------------------------------------------------+
| Grants for yangfan@localhost |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'yangfan'@'localhost' IDENTIFIED BY PASSWORD '*F6131BD316F9043F5FE0E5B95F5713D6F86A157F' |
| GRANT USAGE ON `test`.* TO 'yangfan'@'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------+
注意:USAGE 便是上文提到的“無權限”的權限。
我們再刪除賬戶 ‘yangfan’@’127.0.0.1’ 的 INSERT 和 UPDATE 的權限:
MariaDB [(none)]> REVOKE INSERT, UPDATE ON test.* FROM 'yangfan'@'127.0.0.1';
查看結果:
MariaDB [(none)]> SHOW GRANTS FOR 'yangfan'@'127.0.0.1';
+----------------------------------------------------------------------------------------------------------------+
| Grants for yangfan@127.0.0.1 |
+----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'yangfan'@'127.0.0.1' IDENTIFIED BY PASSWORD '*F6131BD316F9043F5FE0E5B95F5713D6F86A157F' |
| GRANT SELECT ON `test`.* TO 'yangfan'@'127.0.0.1' |
+----------------------------------------------------------------------------------------------------------------+
