用戶訪問權限信息存儲在一組規則的MyISAM表中,稱之爲授權表。這些表位於mysql數據庫中,分別是:
- user :全局層級權限(gobal privileges)
- db:數據庫層級權限(database-specific privileges)
- tables_priv:表層級權限(table-specific privilege)
- columns_priv:列層級權限(column-specific privilege)
其他表提供了用戶訪問和安全的細調(fine-tuning)。可以直接使用標準的SQL語句在這些表中操縱數據,後面接着FLUSH PRIVILEGES語句來更新服務器緩存。不過更推薦專門的SQL語句來管理用戶並設置訪問權
- CREATE USER:創建用戶
- GRANT:創建用戶賬戶,爲新用戶賬戶設置權限或者爲現有的用戶設置權限
- REVOKE:撤銷權限
- RENAME USER:修改用戶名
- SET PASSWORD:修改密碼
- DROP USER:刪除用戶賬戶
語句和函數
與安全和用戶有關的語句列表
CREATE USER、DROP USER、FLUSH、GRANT、RENAME USER、RESET、REVOKE、SE PASSWORD、SHOW GRANTS、SHOW PRIVILEGES
與函數有關的語句列表
AES_DECRYPT()、AES_ENCRYPT()、CURRENT_USER()、DECODE()、DES_DECRYPT()、DES_ENCRYPT()、ENCODE()、ENCRYPT()、MD5()、OLD_PASSWORD()、PASSWORD()、SESSION_USER()、SHA()、SHA1()、SYSTEM_USER()、USER()
CREATE USER
CREATE USER 'user'[@'host'] [IDENTIFIED BY [PASSWORD] 'password'][, ...]
host使用localhost或者127.0.0.1可以本地訪問MySQL,使用通配符%允許客戶端指定用戶從任意主機連接。
用戶密碼位於IDENTIFIED BY子句之後,並在引號中用存文本給出。不必使用PASSWORD()對密碼加密;密碼加密工作會自動完成。如果打算把密碼設置成哈希值,使用IDENTIFIED BY PASSWORD子句,如果沒有指定password子句,密碼爲空。後續使用SET PASSWORD語句來設置密碼。
使用逗號分隔的列表指定多個用戶賬戶。
DROP USER
DROP USER 'user'@'host'
從MySQL5.0.2版本開始,這條語句將刪除用戶賬戶和來自所有授權表的特權。
一些用戶可能不止有一個賬戶(用戶和主機的組合)。爲了確保這一點,應該檢查mysql.user表:
select user,host from mysql.user where user like 'sss';
5.0.2版本之前,drop user並不刪除具有全局權限的用戶。爲了撤銷用戶賬戶的權限,在使用drop user之前,使用revoke語句
revoke all on *.* from ''@'';
drop user 'use'@'host'
all選項用以確保刪除所有權限。*.* 涵蓋了所有數據庫中的所有表。
在mysdql4.1.1版本之前,必須使用如下語句而不是drop user語句:
delete from mysql.user where user='' and host = '';
flush privileges;
必須使用flush privileges才能令前面的delete 語句失效。而在drop user語句之後,這個語句並非必須的。
FLUSH語法
FLUSH [LOCAL|NO_WRITE_TO_BINLOG] option[,…]
選項:
DES_KEY_FILE,HOSTS,LOGS,MASTER,PRIVILEGE,QUERY_CACHE,STATUS,TABLE,TABLES,TABLES WITHOUT READ LOCK,USER_RESOURCES
使用FLUSH語句可以清楚並且重載MySQL的臨時緩存。想要執行FLUSH命令,必須擁有RELOAD權限。爲了防止該語句攜入二進制日誌文件,可以使用NO_WRITE_TO_BINLOG標記或者其別名LOCAL。
從5.1版本開始,FLUSH不能用在存儲函數和觸發器中,但是可以用在存儲過程之中。
GRANT 語法
GRANT
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
TO user [auth_option] [, user [auth_option]] ...
[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]
[WITH {GRANT OPTION | resource_option} ...]
GRANT PROXY ON user
TO user [, user] ...
[WITH GRANT OPTION]
object_type: {
TABLE
| FUNCTION
| PROCEDURE
}
priv_level: {
*
| *.*
| db_name.*
| db_name.tbl_name
| tbl_name
| db_name.routine_name
}
user:
(see Section 6.2.4, “Specifying Account Names”)
auth_option: {
IDENTIFIED BY 'auth_string'
| IDENTIFIED WITH auth_plugin
| IDENTIFIED WITH auth_plugin BY 'auth_string'
| IDENTIFIED WITH auth_plugin AS 'auth_string'
| IDENTIFIED BY PASSWORD 'auth_string'
}
tls_option: {
SSL
| X509
| CIPHER 'cipher'
| ISSUER 'issuer'
| SUBJECT 'subject'
}
resource_option: {
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
}