# 权限表
MYSQL服务器通过权限表
来控制用户对数据库的访问,权限表存放在系统库mysql
中。MySQL数据库系统会根据
这些权限表的内容为每个用户赋予相应的权限, 这些权限表中最重要的是user表
、db表
除此之外,还有table_priv表
、column_priv表
和proc_priv表
等。
在MySQL启动时,服务器将这些数据库表中权限信息的内容读入内存。
1. user表
user表是MySQL中最重要的一个权限表, 记录用户账号和权限信息 ,有49个字段。如下图:
这些字段可以分成4类,分别是范围列(或用户列)、权限列、安全列和资源控制列。
1.范围列(或用户列)
user表的用户列包括Host, User、authentication_string,分别表示主机名、用户名和密码。Host指明允许访问的IP或主机范围,user指明允许访问的用户·其中User 和 Host为上User表的联合主键.
当用户与服务器之间建立连接时, 输入的账户信息中的用户名称、主机名和密码必须匹配User表中对应的字段,只有3个值都匹配的
时候,才允许连接的建立· 这3个字段的值就是创建账户时保存的账户信息。修改用户密码时,实际就是修改user表的authentication_string字段的值
- host : 表示连接类型
- % 表示所有远程通过 TCP方式的连接
- IP 地址 如 (192.168.1.2、127.0.0.1) 通过制定ip地址进行的TCP方式的连接
- 机器名 通过制定网络中的机器名进行的TCP方式的连接
- ::1 IPv6的本地ip地址,等同于IPv4的 127.0.0.1
- localhost 本地方式通过命令行方式的连接 ,比如mysql -u xxx -p xxx 方式的连接。
- user : 表示用户名,同一用户通过不同方式链接的权限是不一样的。
- password : 密码
- 所有密码串通过 password(明文字符串) 生成的密文字符串。MySQL 8.0 在用户管理方面增加了 角色管理,默认的密码加密方式也做了调整,由之前的 SHA1 改为了 SHA2 ,不可逆 。同时 加上 MySQL 5.7 的禁用用户和用户过期的功能,MySQL 在用户管理方面的功能和安全性都较之 前版本大大的增强了。
- mysql 5.7 及之后版本的密码保存到 authentication_string 字段中不再使用password 字 段。
2.权限列
权限列的字段决定了用户的权限,描述了在全局范围内允许对数据和数据库进行的操作,包括查询权限、修改权限等普通权限。
还包括关闭服务器、超级权限和加载用户等高级权限
普通权限用于操作数据库;高级权限用于数据库管理。
user表 中对应的权限是针对所有用户数据库的 , 这些字段值的类型为ENUM,可以取的只能为Y和N, Y表示该用户有对应的权限;N表示用户没有对应的权限。从user表的结构可以看到,这些字段的值法默认都是N, 如果要修改权限就可以使用GRANT语句或Update 语句直接修改user表 的这些字段来修改用户对应的权限.
- Grant_priv字段
- 表示是否拥有GRANT权限
- Shutdown_priv字段
- 表示是否拥有停止MySQL服务的权限
- Super_priv字段
- 表示是否拥有超级权限
- Execute_priv字段
- 表示是否拥有EXECUTE权限。拥有EXECUTE权限,可以执行存储过程和函数。
- Select_priv , Insert_priv等
- 为该用户所拥有的权限。
3.安全列
安全列只有6个字段,其中两个是ssl相关的(ssl_type、ssl_cipher),用于 加密 ;两个是x509 相关的(x509_issuer、x509_subject),用于 标识用户 ;另外两个Plugin字段用于 验证用户身份 的插件, 该字段不能为空。如果该字段为空,服务器就使用内建授权验证机制验证用户身份。
4.资源控制列
资源控制列的字段用来 限制用户使用的资源 ,包含4个字段,分别为:
①max_questions,用户每小时允许执行的查询操作次数;
②max_updates,用户每小时允许执行的更新 操作次数;
③max_connections,用户每小时允许执行的连接操作次数;
④max_user_connections,用户 允许同时建立的连接次数。
一个小时内用户查询或者连接数量超过资源控制限制.用户将被锁定,直到下一个小时才可以再次执行对应的操作。可以使用GRANT语句更新这些字段的值·
查看字段:
DESC mysql.user;
查看用户, 以列的方式显示数据:
SELECT * FROM mysql.user \G;
查询特定字段:
SELECT host,user,authentication_string,select_priv,insert_priv,drop_priv
FROM mysql.user;
2 db表
db表是MySQL数据库中非常重要的权限表。db表中存储了用户对某个数据库的操作权限,决定用户能从哪个主机存取哪个数倨0库, db表比较常用,
user表中的权限是针对所有数据库的如果, 如果user表中的select_priv
字段取值为Y, 那么该用户可以查询所有数据库中的表, 如果希望用户只对某个数据库有操作权限,那么需要将user表中对应的权限 设置为N,然后在db表中设置对应数据库的操作权限。由此可知道, 用户先根据user表的内容获取操作权限,然后根据db表的内容获取库权限
使用DESCRIBE查看db表的基本结构:
DESCRIBE mysql.db;
执行结果显示, db表大致分为两类, 分别为 用户列和权限列
- 用户列 db表用户列有3个字段,分别是Host、User、Db。这3个字段分别表示主机名、用户名和数据库 名。表示从某个主机连接某个用户对某个数据库的操作权限,这3个字段的组合构成了db表的主键。
- 权限列
Create_routine_priv
和Alter_routine_priv
这两个字段决定用户是否具有创建和修改存储过程的权限。
3 tables_priv表和columns_priv表
tables_priv表用来 对表设置操作权限 ,columns_priv表用来对表的 某一列设置权限 。tables_priv表和 columns_priv表的结构分别如图:
desc mysql.tables_priv;
各个字段说明如下
- Host, Db, User, 和Table_name 四个字段分别表示主机名、数据库名、用户名和表名。
- Grantor 表示修改该记录的用户。
- Timstamp 表示修改该记录的时间。
- Table_priv 表示对象的操作权限, 包括 'Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger'
- Column_priv 表示对表中的列的操作权限, 包括'Select','Insert','Update','References'
desc mysql.columns_priv;
其中. Column_name 用来指定对那些数据列具有操作权限
4. procs_priv表
procs_priv表可以对 存储过程和存储函数设置操作权限 ,表结构如图:
desc mysql.procs_priv;
- Host、Db和User, 字段分别表示主机名、数据库名和用户名。
- Routine-name 表示存储过程或函数的过程。
- Routine-type 表示存储过程或函数的类型。Routine_type 字段有两个值, 分别是FUNTION和PROCEDURE:
FUNCTION 表示这是一个存储函数, PROCEDURE 表示这是一个存储过程 - Grantor 是插入或修改该记录的用户
5. 访问控制
正常情况下,并不希望每个用户都可以执行所有的数据库操作:当MySQL允许一个用户执行各种操作时,它将首先核实该用户向MySQL服务器发送的连接请求,然后确认用户的操作请求是否被允许。这个过程称为MySQL中的访问控制过程。MySQL的访问控制分为两个阶段:连接核实阶段和请求核实阶段。
5.1 连接核实阶段
当用户试图连接MySQL服务器时,服务器基于用户的身份以及用户是否能提供正确的密码验证身份来确 定接受或者拒绝连接。即客户端用户会在连接请求中提供用户名、主机地址、用户密码,MySQL服务器 接收到用户请求后,会使用user表中的host、user和authentication_string这3个字段匹配客户端提供信 息。
服务器只有在user表记录的Host和User字段匹配客户端主机名和用户名,并且提供正确的密码时才接受 连接。如果连接核实没有通过,服务器就完全拒绝访问;否则,服务器接受连接,然后进入阶段2等待 用户请求。
5.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服务器之后只执行对MySQL的管理操作,此时只 涉及管理权限,因此MySQL只检查user表。另外,如果请求的权限操作不被允许,MySQL也不会继 续检查下一层级的表。