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官方手册》 如有问题,敬请指出