综述
mysql作为一个开源的数据库,有着一套完整的访问控制体系。整个过程分为两个阶段。第一个是Connection Verification
即连接验证;第二个是Request Verification
即请求验证
阶段一 : 连接验证
当你想连接服务器的时候,是否可以是通过以下条件来判断的
- 你的凭证和密码是否正确
- 你的账户是否被锁定
服务器会先校验你的凭证,然后校验账户的锁定状态
凭证校验是基于user
表的 (Host, User, and Password).只有这三列都验证通过才通过
凭证是由两部分组成的
- mysql用户
- 请求所在机器的host
如果user
表中的user
一列不为空,那么必须精确匹配,如果为空那么匹配任何用户。如果连接字符串的用户为空,那么意味着这一阶段不做校验,全交由第二阶段来完成校验。
password
可以为空,但不是任意匹配的意思。他意味着在为空的时候连接字符串中不能传密码。
mysql不存储明文,存储的都是加密后的。从mysql的角度来看加密后的密码才是真正的密码。
当user
表中有多条记录匹配的时候,mysql需要选择其中一条来使用。解决过程如下:
- 当服务器读取
user
表内容到内存的时候,首先进行排序 - 当一个客户端尝试连接的时候,按照排列顺序进行尝试
- mysql使用第一个匹配到的规则
排序规则是根据host
的精确度来排列的。
- 主机名和ip地址是最精确的。
- % 是最不精确的,它意味着任意host
- 空字符串同%一样,但是排在%后
- 如果host一样,那么根据
user
的精确度来完成。user
为空最低
如果存在多条精确度一样的,那么采用顺序不能保证
账户说明
mysql的一个用户是有用户名和主机名来确定的
- 类似
'user_name'@'host_name'
. - 一个账户如果只考虑用户名,那么等同于
'user_name'@'%'
.
下面说下host的形式
- host可以是hostname,也可以是ip(IPV4或者IPV6).'localhost'意味这本地地址,不走tcp/ip。
127.0.0.1
意味着ipv4本地循环地址,::1
意味着ipv6本地循环地址 %
和_
是通配符的意思,比如%.mysql.com- 对于host来讲,可以接受带有掩码的ip配置格式为
host_ip/netmask
服务器在校验host的时候,会使用DNS返回的值(hostname或者ip) 。除了用掩码配置的形式外,全部采用字符串匹配。所以必须保证配置的信息和DNS返回的格式一致。比如192.168.1.1
和192.168.01.1
不是一个
注:本机通过hosts文件配置的解析和dns干的一样的事儿。
阶段二 : 请求校验
如果已经建立了连接,那么就进入第二阶段的权限校验。这些权限校验可以来自以下情况,user, db, tables_priv, columns_priv, or procs_priv tables。
- user表用来配置全局的基础权限而不用限定默认数据库。如果配置了删除权限,那么意味着可以删除任何数据库中的任何表的记录
- db表用来配置数据库级别的权限
- tables_priv 表级
- columns_priv 列级
- procs_priv 存储过程级
通过以上两个阶段就完成了权限的校验。
确定当前连接用户信息
连接到mysql后输入\s,则可以查看用户信息,如下所示
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.6.17, for linux-glibc2.5 (x86_64) using EditLine wrapper
Connection id: 78
Current database:
Current user: test@iz2ze8sexbgdravxyvdcsqz
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.38-log MySQL Community Server (GPL)
Protocol version: 10
Connection: 172.17.96.65 via TCP/IP
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
TCP port: 39306
Uptime: 1 hour 28 min 14 sec
Threads: 41 Questions: 16240 Slow queries: 0 Opens: 1076 Flush tables: 1 Open tables: 477 Queries per second avg: 3.067
--------------
在输出的结果信息中 Current user:
就表示了当前的用户,那么授权的时候就可以通过这个来进行了
参考地址 https://dev.mysql.com/doc/refman/5.6/en/connection-access.html