MySQL访问控制实现原理

MySQL访问控制实际上由两个功能模块共同组成,一个是负责“看守MySQL大门”的用户管理模块,另一个就是负责监控来访者每一个动作的访问控制模块。用户管理模块决定造访客人能否进门,而访问控制模块则决定每个客人进门能拿什么不能拿什么。

一、用户管理
1、mysql.user表
访问者提供来源的主机名(或者主机IP地址信息)和访问者的来访“暗号”(登录用户名和登录密码),这两部分中的任何一个没有能够匹配上都无法让看守大门的用户管理模块乖乖开门。
Host存放信任的主机,可以是:
1)主机名(如:mytest)
2)域名(如:www.domain.com)
3)以“%”来充当通配符的某个域名集合(如:%.domain.com)
4)一个具体的IP地址(如:1.2.3.4)
5)存在通配符的IP集合(如:1.2.3.%)
6)用“%”代表任何主机

2、权限更新
FLUSH PRIVILEGES会强行让MySQL更新Load到内存中的权限信息;
GRANT、REVOKE或者CREATE USER和DROP USER操作会直接更新内存中俄权限信息;
重启MySQL会让MySQL完全从grant tables中读取权限信息。

二、访问控制
当客户端连接通过用户管理模块的验证,可连接上MySQL Server之后,就会发送各种Query和Command给MySQL Server,以实现客户端应用的各种功能。当MySQL接收到客户端的请求之后,访问控制模块是需要校验该用户是否满足提交的请求所需要的权限。权限校验过程是从最大范围的权限往最小范围的权限开始依次校验所涉及到的每个对象的每个权限。

在验证所有所需权限的时候,MySQL首先会查找存储在内存结构中的权限数据,首先查找Global Level权限,如果所需权限在Global Level都有定义(GRANT或者REVOKE),则完成权限校验(通过或者拒绝),如果没有找到所有权限的定义,则会继续往后查找Database Level权限,进行Global Level未定义的所需权限的校验,如果仍然没有能够找到所有所需权限的定义,MySQL会继续往更小范围的权限定义域查找,也就是Table Level,最后则是Column Level或者Routine Level。

mysql.user,mysql.db,mysql.host,mysql.table_priv和mysql.column_priv这五个