mysql使用系统库mysql的user表来存储用户信息。mysql.user表详细的记录了用户名,对应的允许连接的主机信息还有各种全局权限标识位。
用户管理
创建用户
CREATE USER '用户名'@'host主机' IDENTIFIED BY '密码';
上面是创建用的基本命令,指定了用户名,密码和允许连接的主机。其中host如果设置为localhost,则是只允许本机连接,不允许远程连接。如果开放远程连接可以使用'%'(允许所有主机连接)。一般root用户不开启远程连接为好。也可以使用通配符,如'192.168.10.%'
关于密码,以前的版本可以使用PASSWORD('密码')函数来设置密码,该函数已经被标记为过时,且在mysql8中被删除了,尽量直接使用密码明文即可,下面的auth plugin会自动进行密码的加密。
除了基本信息外,还可以有其它选项进行账号属性设置
1、设置密码校验插件(auth plugin)
CREATE USER 'jeffrey'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'password'
密码的存储都是密文,在密码加密过程中可以指定密码认证插件,使用上面的IDENTIFIED WITH语句来明确指定认证插件,其中caching_sha2_password就是一种认证方式。mysql有多个认证插件,在MySQL 8.0.27之前的版本,使用default_authentication_plugin变量来定义默认的认证插件
5.7
mysql> SELECT @@default_authentication_plugin;
+---------------------------------+
| @@default_authentication_plugin |
+---------------------------------+
| mysql_native_password |
+---------------------------------+
8.0
mysql> SELECT @@default_authentication_plugin ;
+---------------------------------+
| @@default_authentication_plugin |
+---------------------------------+
| caching_sha2_password |
对于mysql5.7默认的认证插件方式是mysql_native_password,对于8.0版本新增了一个caching_sha2_password作为默认认证插件。
2、设置密码过期时间
CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 180 DAY;
使用PASSWORD EXPIRE语句来指定密码的有效期,像上面的INTERVAL 180 DAY就是180天后过期。
如果没有明确指定密码过期策略,默认使用default_password_lifetime指定值来确认密码过期方式。
mysql> select @@default_password_lifetime;
+-----------------------------+
| @@default_password_lifetime |
+-----------------------------+
| 0 |
default_password_lifetime默认值是0表示永远不过期,如果指定一个大于0的值,代表多少天后过期。
密码过期有以下常见格式:
1、PASSWORD EXPIRE
后面没有任何参数,密码立即过期。这样可以创建一个不能登录的账号
2、PASSWORD EXPIRE DEFAULT
使用默认的过期策略,也就是default_password_lifetime指定的方式
3、PASSWORD EXPIRE NEVER
永不过期
4、PASSWORD EXPIRE INTERVAL N DAY
N天后过期
3、锁定用户
CREATE USER test@'%' ACCOUNT LOCK;
锁定的用户,客户端登录会报:Error number: 3118
; Symbol: ER_ACCOUNT_HAS_BEEN_LOCKED; SQLSTATE: HY000 . Account is locked.错误。
4、访问资源限制
CREATE USER 'jeffrey'@'localhost'
WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100
MAX_USER_CONNECTIONS 10;
- MAX_USER_CONNECTIONS
当前用户最大允许创建连接数,默认值使用max_user_connections变量,变量值为0表示不限制。
- MAX_CONNECTIONS_PER_HOUR ,MAX_QUERIES_PER_HOUR,MAX_UPDATES_PER_HOUR
这三个参数限制了每小时连接数、查询数和更新数。
用户修改
用户的修改要素和create语句是一样的,只不过语句变成了ALTER.如下:
mysql
ALTER USER 'jeffrey'@'localhost'
IDENTIFIED WITH sha256_password BY 'new_password'
PASSWORD EXPIRE INTERVAL 180 DAY;
修改用户时:用户名和host组成了条件信息。
用户删除
DROP USER 'jeffrey'@'localhost';
如果不指定host,默认删除host值为'%'的记录。
权限管理
权限分类
数据库有很多中权限,按照作用范围不同大致可以分为以下几种权限:
全局权限
ALL [PRIVILEGES]:所有的权限
SHOW DATABASES:使用SHOW DATABASES 命令查看数据库列表权限
PROCESS:允许使用SHOW PROCESSLIST查看所有进程权限
SHUTDOWN:允许使用mysqladmin shutdown命令关闭数据库权限
FILE:允许文件操作权限,像select into outfile,load data infile等都需要该权限
CREATE USER:允许CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES操作
REPLICATION SLAVE:允许用户读取binlog进行主从复制
REPLICATION CLIENT:允许查看复制状态,像show master status,show slave status,show binary logs命令
SUPER:超级权限,允许执行一系列数据库管理命令,像CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, and mysqladmin等命令
RELOAD:允许执行flush命令
CREATE TABLESPACE:表空间管理权限
GRANT OPTION:分配权限操作
数据库对象操作权限:
CREATE VIEW:创建视图权限
SHOW VIEW:使用SHOW CREATE VIEW查看视图权限
TRIGGER:触发器操作权限
CREATE ROUTINE:创建存储过程和函数权限
ALTER ROUTINE:修改存储过程和函数权限
EXECUTE:执行存储过程和函数权限
INDEX:索引操作权限
CREATE TEMPORARY TABLES:创建临时表权限
CREATE:创建数据库,创建表权限
ALTER:修改表操作
DROP:删除数据库、表、视图,truncate table等权限
LOCK TABLES:锁表权限
表数据操作权限:
INSERT:插入数据权限,ANALYZE TABLE, OPTIMIZE TABLE操作也需要该权限
DELETE:删除数据
SELECT:查询权限
UPDATE:更新数据权限
更多权限可以查看官方网站 privileges-provided
权限分配
权限的分配使用GRANT语句
GRANT priv_type... ON [object_type] priv_level TO user
priv_type是权限列表,多个用英文逗号相隔
object_type:对象范围,可以是数据库,表,存储过程等。
mysql
#全局级别
GRANT ALL ON *.* TO 'someuser'@'somehost';
#数据库级别
GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';
#表级别
GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@'somehost';
#列级别
GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@'somehost';
#ROUTINE
GRANT CREATE ROUTINE ON mydb.* TO 'someuser'@'somehost';
被grant分配后的权限,根据权限类型的不同存储在系统库不同的表中:
全局权限存储在:sys.user表中
数据库级别权限存储在:mysql.db表中
表级权限存储在:mysql.tables_priv表
列级别存储在:mysql.columns_priv表
ROUTINE类型存储在mysql.procs_priv。
user需要用户名和host两部分表示,格式是 username@host。host同创建用户时host,username可以是空表示给所有用户赋通用权限。
例:
mysql
#将db1数据库所有权限赋给用户
GRANT ALL ON db1.* TO 'jeffrey'@'localhost';
#将db2库invoice对象的查询权限赋给用户
GRANT SELECT,INSERT ON db2.invoice TO 'jeffrey'@'localhost';
权限回收
权限的回收使用REVOKE语句,revoke语法几乎和grant一致,只是grant改成了revoke。
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
权限查询
使用show grants可以查看分配的用户权限,如果要查特定用户的可以使用for user来指定
mysql
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
SHOW GRANTS FOR 'jeffrey'@'localhost';
在grant或revoke修改了权限后,一般会使用FLUSH PRIVILEGES命令使权限生效。FLUSH PRIVILEGES会从新加载系统权限表数据到内存。