在鉴权阶段由服务器返回的包可以通过 read_auth_result() 函数进行捕获分析。该函数的唯一参数是由服务器返回的鉴权包的本身。由于该包是一个裸 MySQL 网络协议包,你必须通过检查包的首字节来确认包的类型及其对应的内容。可以使用常量 MYSQLD_PACKET_ERR 和 MYSQLD_PACKET_OK 来标示当前鉴权是否成功:
function read_auth_result(auth) local state = auth.packet:byte() if state == proxy.MYSQLD_PACKET_OK then print("<-- auth ok"); elseif state == proxy.MYSQLD_PACKET_ERR then print("<-- auth failed"); else print("<-- auth ... don't know: " .. string.format("%q", auth.packet)); end end
如果一个允许使用 long-password 的客户端尝试向支持 long-password 的服务器进行鉴权,但是实际提供的用户密码确是 short 的,read_auth_result() 函数将会被调用两次。第一次,auth.packet:byte() 的值将会等于 254 ,表明客户端应该使用老版本的密码协议再尝试一次。第二次调用 read_auth_result() 函数时,auth.packet:byte() 的值将会指出鉴权是否真正成功。
时间: 2024-09-22 16:17:22