Skip to content

Instantly share code, notes, and snippets.

@xcaspar
Last active August 29, 2015 14:25
Show Gist options
  • Save xcaspar/b1160c71a3a73385f50c to your computer and use it in GitHub Desktop.
Save xcaspar/b1160c71a3a73385f50c to your computer and use it in GitHub Desktop.

MySQL账号认证

@(mysql) ####查询语句处理流程 MySQL一条查询语句的处理是:【语句合法性检查】——【语义检查】——【获取对象解析锁】——【数据访问权限的核对】——【查询优化】——【语句执行】,这次主要介绍一下【数据访问权限的核对】中的“账号认证”。
用户账号是由user(用户名)和host(客户端主机)共同组成的,其是通过默认的mysql数据库中的user表来定义的。其中Host、User、Password三个字段的信息作为接入连接的认证参考。可以通过SHOW CREATE TABLE user \G命令来查看user表的内部结构。
User是连接登录使用的用户名;Host是客户端的主机名称或者是IP地址;Password是提供给服务器端登录认证的密码。三个字段都不得为NULL,默认会将他们都设置为空的字符串,也就是说User可以为匿名用户,
Password也可以不设置密码,Host则表示允许从任何主机上连接。
账号认证是通过mysql内核5个函数来处理的:

  • init_check_host:查看是否存在与该客户端主机名称匹配的任何可能记录。
  • acl_check_host:判断是否存在用户能够满足指定被连接的主机名或IP地址。
  • create_random_string:产生一个随机字符串,用于密码认证。
  • check_user:核实用户是否存在以及提供的密码是否正确。
  • acl_root:用来核实用户资源信息。

####具体有限原则 MySQL采用具体优先原则。比如Host字段为IP地址或者主机名称就会被认为是具体,而’%’或是’’空字符就认为是非具体信息。 来看一个例子:
user表存在的信息如下:
+---------------------------------------+------------------------+------ | Host | User | ……. +---------------------------------------+------------------------+------- | % | xiao | …….. | 127.0.0.1 | |…….. +---------------------------------------+------------------------+-------

此时使用 mysql –h 127.0.0.1 –u xiao –p 命令去登录数据库服务器,使用 SELECT CURRENT_USER(); 查看当前连接的用户信息是 @127.0.0.1 。
当前使用的用户却是匿名用户,而不是指定的xiao这个用户,原因是,user表从Mysql数据库读到内存以后,会根据Host字段的具体程度重新对这三个字段组成的记录进行排列,然后服务器会根据最先匹配的一条记录去允许登录连接。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment