MySQL用户管理与权限控制指南(含底层架构说明)

1、用户管理

默认的五个用户

1.1 创建用户

基本语句形式:

sql 复制代码
CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']];

用户名参数表示新建用户的账户,由用户User以及主机名Host构成;示例:

sql 复制代码
CREATE USER zhang3 IDENTIFIED BY '123123';  # 默认host是 %

CREATE USER 'vision'@'localhost' IDENTIFIED BY '123456';

1.2 修改用户

主要指的是修改用户名:将wang5改为li4

sql 复制代码
UPDATE mysql.user 
SET USER='li4' 
WHERE USER='wang5';

FLUSH PRIVILEGES; # 刷新权限

1.3 删除用户

使用DROP方式删除:首先必须拥有DROP USER权限

基本语法形式如下:DROP USER user [ , user ] ...; (默认清除的是host为%的用户

sql 复制代码
DROP USER 'kangshifu'@'localhost';

drop user命令会删除用户以及对应的权限,执行命令后会发现mysql.user表和mysql.db表的相应记录都消失了,是一种推荐的方式。

1.4 设置当前用户密码

(1)使用ALTER USER 命令修改当前用户密码

如下语句代表修改当前登录用户的密码,基本语法:

sql 复制代码
ALTER USER USER() IDENTIFIED BY 'new_password';

(2)使用SET语句修改当前用户密码

使用root用户登录MySQL后,可以使用SET语句来修改密码:

sql 复制代码
SET PASSWORD='new_password';

该语句会自动将密码加密后再赋给当前用户。

1.5 修改其他用户密码

root用户不仅可以修改自己的密码,还能够修改其他普通用户的密码。

(1)使用ALTER语句来修改普通用户的密码

sql 复制代码
ALTER USER 'vision' @ '%' IDENTIFIED BY '新密码';

(2)使用SET命令来修改普通用户的密码

sql 复制代码
SET PASSWORD FOR 'username'@'localhost'='new_password';

2、权限管理

2.1 权限列表

sql 复制代码
show privileges;

MySQL权限分布可以是表权限、列权限、过程权限

2.2 授予权限原则

出于对安全的考量,需遵循以下原则:

  1. 只能授予满足需要的最小权限,防止用户干坏事;
  2. 创建用户的时候限制用户的登录主机,一般是限制或指定IP或者内网IP段;
  3. 为每个用户设置满足密码复杂度的密码;
  4. 定期清理不需要的用户,回收权限或者删除用户。

2.3 授予权限

授权方式有:直接给用户授权以及角色赋予用户给用户授权。

授权命令:该权限如果发现没有该用户,则会直接新建一个用户。

sql 复制代码
GRANT 权限1,权限2,...权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY '密码口令'];

示例:给viision用户授予查询、更新dbtest1所有表的特权

sql 复制代码
GRANT SELECT, UPDATE ON dbtest1.* TO 'viision'@'%';

测试查找以及删除命令:

示例 :授予所有的权限并且密码为123(不包括grant的权限

sql 复制代码
GRANT ALL PRIVILEGES ON *.* TO joe@'%' IDENTIFIED BY '123'; 

2.4 收回权限

收回用户不必要的权限在一定程度上能保证系统安全性。

在将用户账户从user表删除之前,应该收回相应用户的全部权限。

收回权限的命令:需要用户重新登录后才生效

sql 复制代码
REVOKE 权限1,权限2,...权限n ON 数据库名称.表名称 FROM 用户名@用户地址;

示例:收回viision用户的查找权限

sql 复制代码
REVOKE SELECT ON dbtest1.* FROM 'viision'@'%';

3、权限表

MySQL服务器通过权限表来控制用户对数据库的访问,例如user表、db表。在启动MySQL时,服务器将这些数据库表中权限信息的内容读入内存

对上述权限表都可以使用DESCRIBE查看基本结构:

sql 复制代码
desc mysql.user;

4、访问控制

当MySQL允许一个用户执行各种操作时,它将首先核实该用户向MySQL服务器发送的连接请求,然后确认用户的操作请求是否被允许。该过程叫做MySQL中的访问控制过程,MySQL的访问控制过程分为两个阶段:连接核实阶段请求核实阶段
MySQL访问控制过程

4.1 连接核实阶段

当用户试图连接MySQL服务器时,服务器基于用户的身份以及用户是否能提供正确的密码验证身份来确定接受或者拒绝连接。即客户端用户会在连接请求中提供用户名、主机地址、用户密码, MySQL服务器接收到用户请求后,会使用user表 中的user、host和authentication_string这3个字段匹配客户端提供信息。

服务器只有在user表记录的Host和User字段匹配客户端主机名和用户名,并且提供正确的密码时才接受连接。如果连接核实没有通过,服务器就完全拒绝访问;否则,服务器接受连接,然后进入阶段2等待用户请求。

4.2 请求核实阶段

一旦建立了连接,服务器就进入了访问控制的阶段2,也就是请求核实阶段。对此连接上进来的每个请求,服务器检查该请求要执行什么操作、是否有足够的权限来执行它,这正是需要授权表中的权限列发挥作用的地方。这些权限可以来自user、db、table_priv和column_priv表。

确认权限时,MySQL首先检查user表 ,如果指定的权限没有在user表中被授予,那么MySQL就会继续检查db表 ,db表是下一安全层级,其中的权限限定于数据库层级,在该层级的SELECT权限允许用户查看指定数据库的所有表中的数据;如果在该层级没有找到限定的权限,则MySQL继续 检查tables_priv表 以及columns_priv表 ,如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL将返回错误信息,用户请求的操作不能执行,操作失败。

说明:MySQL通过向下层级的顺序(从user表到columns_priv表)检查权限表,对应(从服务器-数据库-数据表-列)的顺序。如果请求的权限操作不被允许,MySQL也不会继续检查下一层级表。

相关推荐
刘~浪地球2 小时前
Redis 从入门到精通(十一):持久化配置
数据库·redis·缓存
少司府2 小时前
C++基础入门:类和对象(中)
c语言·开发语言·c++·类和对象·运算符重载·默认成员函数
正在走向自律2 小时前
深度剖析 KES 行标识体系:OID 与 ROWID 核心原理、实战案例及性能优化
数据库·oid·kes·rowid
橘子编程2 小时前
操作系统原理:从入门到精通全解析
java·linux·开发语言·windows·计算机网络·面试
唔662 小时前
原生 Android(Kotlin)仅串口「继承架构」完整案例二
android·开发语言·kotlin
错把套路当深情2 小时前
Kotlin 全方向开发技术栈指南
开发语言·kotlin
飞Link2 小时前
LangGraph 核心架构解析:节点 (Nodes) 与边 (Edges) 的工作机制及实战指南
java·开发语言·python·算法·架构
一直都在5722 小时前
MySQL索引优化
android·数据库·mysql
wjp@0013 小时前
SQL server导出导入数据
运维·服务器·数据库