mysql认证阶段_第一阶段(帐号和密码认证)

当您尝试连接MySQL Server时,Server根据如下条件来决定是否需要接受或拒绝连接:

您的身份信息(帐号名,由user_name@host_name格式组成)以及密码信息是否可以验证通过

你的帐户是否处于锁定状态

当MySQL Server接收到一个新的连接请求时,Server首先检查用户凭证(帐号+密码),然后检查帐户的锁定状态。任意一个步骤检查失败则拒绝连接发访问。如果两个步骤都通过检查,则进入第2阶段并等待执行请求

MySQL Server 使用user表中的Host、User、authentication_string三个列存储的用户凭证信息来执行凭证检查。用户的锁定状态记录在user表的account_locked列中。如下:

root@localhost : (none) 12:43:38> select host,user,authentication_string,account_locked from mysql.user;

+-----------+---------------+-------------------------------------------+----------------+

| host | user | authentication_string | account_locked |

+-----------+---------------+-------------------------------------------+----------------+

| localhost | root | *3B3D7D2FD587C29C730F36CD52B4BA8CCF4C744F | N |

| localhost | mysql.session | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | Y |

| localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | Y |

| % | admin | *3B3D7D2FD587C29C730F36CD52B4BA8CCF4C744F | N |

| % | repl | *3B3D7D2FD587C29C730F36CD52B4BA8CCF4C744F | N |

| % | qbench | *1966B10B87AA6A1F8E1215A1C81DDD5FBBA6B0D0 | N |

| % | program | *3B3D7D2FD587C29C730F36CD52B4BA8CCF4C744F | N |

+-----------+---------------+-------------------------------------------+----------------+

7 rows in set (0.00 sec)

# 帐户锁定状态可以通过ALTER USER语句进行更改

ALTER USER [IF EXISTS]

user [auth_option] [, user [auth_option]] ...

[REQUIRE {NONE | tls_option [[AND] tls_option] ...}]

[WITH resource_option [resource_option] ...]

[password_option | lock_option] ...

......

lock_option: {

ACCOUNT LOCK

| ACCOUNT UNLOCK

}

上文中提到过,用户的身份信息基于两部分组成(user_name和host_name),对于身份信息的两个组成部分,有如下认证规则:

如果用户名列值不为空,则用户尝试连接时就必须传入用户名字符串,且必须完全匹配,如果用户名列值为空,则为空的列值在进行认证时,可以匹配任何用户名(包括用户名称为空和不为空的,为空的用户名被称为匿名用户)。在帐号访问控制的第一阶段匹配到匿名用户的,在第二阶段认证仍然会使用匿名用户。

如果密码信息列authentication_string列为空,则意味着用户尝试连接Server时不需要输入密码(注意:密码信息列与帐号名称列不同,密码信息列为空时,只能匹配空串的密码,不能匹配任意密码)。如果Server使用了认证插件对客户端进行身份验证,则插件实现的身份验证方法中可能会,也可能不会使用authentication_string密码信息列中的密码字符串。甚至可能还会使用外部密码认证服务器对MySQL Server进行身份验证。

user表中非空的authentication_string列值表示加密过的密码字符串(hash加密)。 MySQL在authentication_string列中不存储明文格式的密码(使用帐户认证插件实现的密码散列方法加密)。在连接认证过程中使用加密的密码来检查密码是否正确。从MySQL的角度来看,加密的密码才是真正的密码,所以,非授权情况下,不要随意让别人知道你的密码信息,特别是对mysql库的访问权限

下表列举了一些user_name和host_name常用的组合:

'fred'@'h1.example.net':表示使用fred用户从h1.example.net主机连接

''@'h1.example.net':表示任何用户从h1.example.net主机连接

'fred'@'%':表示fredon过户从任何主机连接

''@'%':表示任何用户从任何主机连接

'fred'%'%.example.net':表示fred用户从example.net域中的任何主机连接

'fred'@'x.example.%':表示fred用户从x.example.net,x.example.com,x.example.edu任意域名后缀的主机连接(但后缀%限制可能不生效)

'fred'@'192.51.100.177':表示fred用户从IP地址为192.51.100.177的主机连接

'fred'@'192.51.100.%':表示fred用户从192.51.100 C类子网中的任何主机连接

'fred'@'192.51.100.0/255.255.255.0':表示fred用户从192.51.100 C类子网中的任何主机连接

客户端传入Server中的身份标识(主机名和用户名)可能与用户表中的多个行记录匹配成功。当一个用户尝试连接Server时,如果在Server的user表中匹配到多个行记录的身份认证信息,则Server必须确定要能够确定使用哪一行记录进行许可(不同的身份信息行记录可能对应着不同的权限):

Server 只要将user表读入内存,即就会在内存中对用户信息进行排序

当客户端尝试连接时,Server 会按照内存中排好序的内容依次进行匹配

Server 使用与客户端主机名和用户名相匹配的第一行进行授权

Server 使用的排序规则中,先排序主机列值(越精确的值越靠前,字符串主机名和IP地址是最具体的,另外,IP地址的精确性不会受到掩码的影响,例如:192.51.100.13和192.51.100.0/255.255.255.0被视为具有相同的精确度。通配符'%'表示“任何主机”,被视为精确度较差的主机名。空字符串“'也意味着”任何主机“,但精确度比'%'更差,所以排序在'%'之后)。然后再按照用户列值进行排序(排序规则跟主机列值类似),host和user两列的排序规则有点类似与多列索引中的排序规则。

示例一:假设用户表中记录的内容如下所示:

+-----------+----------+-

| Host | User | ...

+-----------+----------+-

| % | root | ...

| % | jeffrey | ...

| localhost | root | ...

| localhost | | ...

+-----------+----------+-

# 当Server将表中的内容读入内存时,会使用刚刚描述的规则在内存中对用户信息行进行排序。排序后的结果如下所示:

+-----------+----------+-

| Host | User | ...

+-----------+----------+-

| localhost | root | ...

| localhost | | ...

| % | jeffrey | ...

| % | root | ...

+-----------+----------+-

# 当客户端尝试连接时,Server 会查看在内存中已排好序的用户身份认证信息,并使用第一个匹配项进行许可。如:对于用户jeffrey的localhost的主机连接,首先,精确匹配localhost主机列,有两列匹配,然后再匹配用户名列,也有两列(空值和jeffrey),两列交集最终确定匹配行为:host=localhost,user='',即''@'localhost'身份

示例二:假设用户表中记录的信息如下所示:

+----------------+----------+-

| Host | User | ...

+----------------+----------+-

| % | jeffrey | ...

| h1.example.net | | ...

+----------------+----------+-

# 在内存中排序之后的内容如下所示:

+----------------+----------+-

| Host | User | ...

+----------------+----------+-

| h1.example.net | | ...

| % | jeffrey | ...

+----------------+----------+-

# 来自h1.example.net主机的jeffrey用户的连接与第一行记录匹配成功,而来自任何主机的jeffrey用户的连接与第二行匹配成功

注意:

通过上述示例可知,当存在匿名用户的时候,如果您能够成功连接到服务器,但您的权限可能不符合您的期望,那么表示您此时可能正在通过其他帐户进行身份验证。可以使用select current_user();或者select current_user;语句来检查你当前登录成功的帐号身份信息是什么?以便确定是否正确对应了权限信息,如下:

mysql> SELECT CURRENT_USER();

+----------------+

| CURRENT_USER() |

+----------------+

| @localhost |

+----------------+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值