用户访问权限信息存储在一组规则的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
}