Mysql登录过程

前提:进行连接MySQL服务器前,需要保证MySQL服务器的启动;

⑴在客户端输入连接主机,用户名,密码等等其他信息。当然连接服务器的方式有多种,我们使用最普通的tcp/ip方式。

启动MySQL客户端,即mysql工具,并使用相应的参数来确定用户的身份;可以在shell下使用以下工具:①mysql -h hostname -u root -ppassword   ②mysql -h host_name -u root -p  ;第一种是需要在命令中输入密码,第二种是以交互的方式使用密码,而且不进行明文显示。如果没有指定连接参数,MYSQL客户端使用默认值,默认主机是localhost,默认用户名在Window中是ODBC,在Unix中是登录名,没有-p,则代表没有密码。默认值也可以在配置文件中进行设置。

⑵阶段1:连接核实

当在Mysql客户端输入了用户名,密码等参数后,服务器需要核实信息是否准确,来确定是否接受和拒绝连接。服务器通过将输入的主机名和用户名与mysql数据库的User表中的host,user对应,提供了正确的密码后才接受连接,然后进行阶段2。

mysql> DESCRIBE USER;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(32)                          | NO   | PRI |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | 
mysql> SELECT Host,User FROM USER ;
+-----------+------------------+
| Host      | User             |
+-----------+------------------+
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
4 rows in set (0.00 sec)

User表中的host值的指定方法是:可以是主机名,IP号,localhost,也可以使用通配符,host值为’%‘匹配任何主机名,空Host值等价于’%‘也可以指定子网掩码,来确定主机的范围,注意:在host字段可以使用通配符,但是mysql不允许匹配以数字和一个点起始的主机名;

user列中不允许使用通配符,可以指定空值,来匹配任何名字。

password列可以是空的,但不是通配符,也不意味着匹配任何密码。即用户必须不指定密码进行连接。

当在user表中,有多个主机匹配规则,一个主机可能与多个主机匹配时,eg:

主机名    用户名 

land.over.com      land      -- > 可接受从 land.over.com主机来的land用户;

%                         land       -->可接受从任意主机来的land用户

如何抉择:

①首先是服务器在启动后,对user表进行排序,(即按照最具体的user值进行排序,例如ip号和主机号,然后是*)②当用户连接时,按照已经排序好的顺序进行浏览,③服务器使用与客户端和用户名匹配的第一个匹配。

⑶阶段2,请求核实

一旦建立了连接,服务器对此连接上的每个请求,服务器检查你想执行什么操作,然后检查是否有足够的权限来执行它。设置权限的表有:user,db,host,table_priv,columns_priv表。

mysql> SELECT Host,User,Select_priv,Insert_priv,Update_priv,Drop_priv FROM USER;
+-----------+------------------+-------------+-------------+-------------+-----------+
| Host      | User             | Select_priv | Insert_priv | Update_priv | Drop_priv |
+-----------+------------------+-------------+-------------+-------------+-----------+
| localhost | mysql.infoschema | Y           | N           | N           | N         |
| localhost | mysql.session    | N           | N           | N           | N         |
| localhost | mysql.sys        | N           | N           | N           | N         |
| localhost | root             | Y           | Y           | Y           | Y         |
+-----------+------------------+-------------+-------------+-------------+-----------+
4 rows in set (0.00 sec)

user表是在全局基础上赋予你权限,即该权限不管当前的数据库是什么均适用,user表权限是超级用户权限;

mysql> SELECT Host,Db,User,Select_priv,Insert_priv FROM DB;
+-----------+--------------------+---------------+-------------+-------------+
| Host      | Db                 | User          | Select_priv | Insert_priv |
+-----------+--------------------+---------------+-------------+-------------+
| localhost | performance_schema | mysql.session | Y           | N           |
| localhost | sys                | mysql.sys     | N           | N           |
+-----------+--------------------+---------------+-------------+-------------+
2 rows in set (0.00 sec)

 db和host赋予数据库特定的权限,db和host表在服务器启动时读取并排序,db表在host,db,user范围上进行排序,host表在host和Db范围上排序。

tables_priv和columns_priv表赋予表和列特定的权限,

mysql> SELECT Host,Db,User,Table_name FROM TABLES_PRIV;
+-----------+-------+---------------+------------+
| Host      | Db    | User          | Table_name |
+-----------+-------+---------------+------------+
| localhost | mysql | mysql.session | user       |
| localhost | sys   | mysql.sys     | sys_config |
+-----------+-------+---------------+------------+
2 rows in set (0.00 sec)

请求过程如下:

当对管理权限进行请求时;检查user表,因为user表是唯一指定管理权限的表,如果有许可请求的操作,则接受,否则,拒绝请求;

当对数据库有关的操作时,服务器先检查user表,如果有许可请求的操作,则接受,访问被授权,如果user表中的权限不够,则检查db和host表特定的用户数据库权限。eg:对于非超级用户,则不会在user表,则回去db表中查看该用户是否对数据库有相应的操作,然后访问才会被授权。

对于表的列的访问,同样会涉及到tables_priv表。

 

当服务器启动时,授权表会被读取到内存生效,当权限发生变化时,客户端的的反应是:表和列的权限在客户端下一次请求时有效,数据库的权限的改变在下一个USE DATA_BASENAME,全局权限的改变和密码的改变在下一次客户端连接时生效。

 

 

参考《mysql官方手册》  如有问题,敬请指出