持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
前言
上篇我们学习了MySQL中的权限管理。有兴趣的小伙伴可以阅读(# MySQL学习-权限管理(三))。
下面我们继续学习MySQL中的权限管理。
权限管理
db表
使用DESCRIBE查看db表的基本结构:
DESCRIBE mysql.db;
- 用户列:db表用户列有3个字段,分别是Host、User、Db。这三个字段分别表示主机名、用户名和数据库名。表示从某个主机连接某个用户用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。
- 权限列:Create_routine_priv和Alter_routine_priv这两个字段决定用户是否具有创建和修改存储过程的权限。
tables_priv和columns_priv表
tables_priv表用来对表设置操作权限,columns_priv表用来对表的某一列设置权限。使用以下语句查看表的基本结构。
DESC mysql.tables_priv;
tables_priv表有8个字段,分别是Host、Db、User、Table_name、Grantor、Timestamp、table_priv和Column_priv。说明如下:
- Host、Db、User、Table_name四个字段分别表示主机名,数据库名,用户名和表名。
- Grantor表示修改该记录的用户。
- Timestamp表示修改该记录的时间。
- Table_priv表示对该对象的操作权限。包括Select、Insert、Update、Delete、Create、Drop、Grant、References、Index和Alter。
- Column_priv字段表示对表中的列的操作权限,包括Select、Insert、Update和References。
procs_priv表
procs_priv表可以对存储过程和存储函数设置操作权限,包含字段:Host、Db、User、Routine_name、Routine_type、Grantor、Proc_priv和Timestamp。
访问控制
- 连接验证核实阶段
当用户试图连接MySQL服务器时,服务器会基于用户的身份以及用户的密码来确定接受或者拒绝连接。即客户端用户会在连接请求中提供用户名、主机地址、用户密码,MySQL接到请求后,会使用user表中的host、user和authentication_string这3个字段匹配客户端提供信息。只有通过验证才能接受连接。如果连接核实没有通过,服务器就拒绝访问,否则,服务器接受连接,然后进入阶段2等待用户请求。 - 请求验证核实阶段
一旦建立了连接,服务器就进入了第2阶段,也就是请求核实阶段。对此连接上进来的每个请求,服务器检查该请求要执行什么操作,是否有足够的权限来执行它。这正是需要授权表中的权限列发挥作用的地方。这些权限来自user、db、table_priv和column_priv表。
确认权限时,MySQL首先检查user表,如果指定的权限没有在user表中被授予,那么MySQl就会继续检查db表,db表是下一安全层级,其中的权限限定于数据库层级,在该层级的SELECT权限允许用户查看指定数据库的所有表中的数据,如果在该层级没有找到限定的权限,则MySQL继续检查tables_priv表以及columns_priv表,如果所有权限表都检查完毕,但还是没有找到允许的权限操作,MySQL将返回错误信息,用户请求的操作不能执行,操作失败。
今天先学习到这里,明天继续。