skip_name_resolve对登录影响的源码分析
skip_name_resolve对登录的影响
版本:mysql5.7.18
情况介绍:
通过--initialize-insecure初始化MySQL数据库,root密码为空,skip_name_resolve默认为OFF。
当设置skip_name_resolve为ON的时候,通过密码方式登录MySQL报告如下错误
ERROR 1045 (28000): Access denied for user 'root'@'127.0.0.1' (using password: NO)
修改kip_name_resolve为OFF后,可以连接
user表中root的host为localhost
源码分析
在check_connection函数中,如果skip_name_resolve为OFF则,该分支为true,否则该分支为false
if (!(specialflag & SPECIAL_NO_RESOLVE))
{
为true是获取tcp连接的主机名,否则将不会获取
在默认情况下,thd->m_main_security_ctx.host().str的值被设置为localhost
在if (acl_check_host(thd->m_main_security_ctx.host().str, main_sctx_ip.str))中
会对host和ip进行判断,是否符合user表中的主机匹配要求
根据上面逻辑,可以看出,如果user表中的host修改为127.0.0.1,则用户登录的验证将会通过
源码讲解
1、在mysqld_get_one_option中解析skip_name_resolve参数
opt_skip_name_resolve变量用于记录,但真正记录并发挥作用的是opt_specialflag
case (int) OPT_SKIP_RESOLVE:
opt_skip_name_resolve= 1;
opt_specialflag|=SPECIAL_NO_RESOLVE;
break;