mysql 账户登录的处理流程

当遇到MySQL登录错误1045时,通常是由于认证失败。本文通过源码分析了客户端认证过程,包括check_connection、acl_check_host和do_auth_once等功能,详细解释了认证流程,如生成scramble、匹配host、使用plugin进行密码验证等步骤。问题出在匹配到的用户记录不正确,解决办法可能是配置skip_name_resolve以避免主机名解析。
摘要由CSDN通过智能技术生成

现场环境mysql账户登录错误,用户名和密码都确认过没有问题的。报错信息如下:

ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: YES)

查看1045对应的错误信息:

perror 1045:MySQL error code 1045 (ER_ACCESS_DENIED_ERROR): Access denied for user '%-.48s'@'%-.64s' (using password: %s), 显然用户名和密码访问被拒绝了,从源码跟踪客户端认证的流程。

 sql_connection.cc:check_connection   客户端认证的入口函数,主要工作:

vio_peer_addr函数:根据vio获取对端的ip地址

ip_to_hostname函数:根据ip解析对应的host_name,在没有配置skip_name_resolve的场景下工作

acl_check_host函数:匹配客户端机器是否满足mysql.user表中的host列,在程序启动的时候会将mysql.user表中的host分为两个hash结构存储:acl_check_hosts和acl_wild_hosts,该函数检查host或者ip是否在这两个结构中包含

acl_authenticate:进行客户端认证的主要函数

 

acl_authenticate 该函数主要功能如下图,其中scrample是生成的一串随机数值,用于认证使用;do_auth_once负责后续的认证工作

 else
  {
    /* mark the thd as having no scramble yet */
    mpvio.scramble[SCRAMBLE_LENGTH]= 1;
    
    /*
     perform the first authentication attempt, with the default plugin.
     This sends the server handshake packet, reads the client reply
     with a user

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值