用户与权限管理
1. 用户管理
- MySQL用户分为root用户和普通用户;
- root用户:超级管理员,拥有所有权限;
- 普通用户:只拥有被赋予的指定权限;
1.1 创建用户
- 执行创建用户语句的用户必须拥有CREATE USER权限;
- 每添加一个用户,mysql.user表中会新增一条对应记录;
- 新增用户没有任何权限,需要为其赋予指定权限;
- 如果新增用户已经存在,会提示错误信息;
- 基本语法:
CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']]
; - 可使用CREATE USER语句同时创建多个用户,并为其指定登录密码;
- 用户名参数表示新建用户的账户,由 用户(User) 和 主机名(Host) 构成,若不指定主机名,则默认为%表示支持所有主机登录;
1.2 修改用户
- 用户对应信息存储在mysql.user表中,因此可直接通过修改用户对应表数据修改用户;
- 只能修改用户名或该用户对应主机;
- 基本语法:
UPDATE mysql.user SET USER='修改用户名' WHERE USER='指定用户名';
- 在执行修改语句后,切记使用
FLUSH PRIVILEGES;
刷新权限;
1.3 删除用户
- 基本语法:
DROP USER user[,user]…;
; - 可同时删除多个用户,如果不指定用户对应主机名,则**默认删除host=%**的指定用户;
1.4 用户密码相关
1.4.1 密码修改
修改当前用户密码: 当前用户登录状态下
# 方式一:
ALTER USER USER() IDENTIFIED BY '新密码';
# 方式二:
SET PASSWORD='新密码';
修改其他用户密码: 当前用户(必须拥有修改其他用户密码的权限,比如root用户)登录状态下
# 方式一:
ALTER USER 具体用户 IDENTIFIED BY '新密码';
# 方式二:
SET PASSWORD FOR 具体用户='新密码';
1.4.2 密码管理机制
2. 权限管理
- MySQL用户只有在被赋予指定权限后,才能执行相关操作;
- root用户拥有所有权限,普通用户只拥有被赋予的权限;
2.1 授予权限原则
2.2 查看权限
- 查看MySQL支持的所有权限:
show privileges;
;
- 查看当前用户拥有的权限:
SHOW GRANTS;
或SHOW GRANTS FOR CURRENT_USER;
或SHOW GRANTS FOR CURRENT_USER();
- 查看其他用户拥有的权限:
SHOW GRANTS FOR 'user'@'主机地址' ;
,前提是当前用户拥有查看其他用户权限的权限;
2.3 授予权限
- 当前用户拥有为其他用户赋予权限的权限(比如root用户);
- 给用户授权的方式有 2 种,分别是通过把 角色赋予用户给用户授权 和 直接给用户授权;
- 基本语法:
GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];
; - 赋予权限时如果发现没有该用户,则会直接新建一个用户;
- 使用
GRANT ALL PRIVILEGES
为某用户赋予所有权限时,不包括为其他用户赋予权限的权限; - 若要使某用户可为其他用户赋予权限,则在为该用户赋予权限时添加
WITH GRANT OPTIN
选项即可;
2.4 收回权限
- 基本语法:
REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
; - 执行收回权限操作后,用户需重新登录后才会生效;
3. 权限表
- MySQL数据库使用权限表控制用户对数据库的访问;
- 权限表存放在MySQL自带库mysql数据库中,涉及到该库下的user、db表,以及tables_priv表、columns_priv表和procs_priv表等;
- MySQL数据库启动时,服务器将权限表中的信息读入内存;
4. 访问控制
- 访问控制过程分为连接核实阶段和请求核实阶段;
- 连接核实阶段:MySQL服务器接收到用户请求后,会使用user表中的host、user和authentication_string这3个字段匹配客户端提供信息。服务器只有在user表记录的Host和User字段匹配客户端主机名和用户名,并且提供正确的密码时才接受连接。如果连接核实没有通过,服务器就完全拒绝访问;否则,服务器接受连接,然后进入阶段2等待用户请求。
- 请求核实阶段: