而新客户端连接老的MySQL的流程如下:
Mysql ->: Authentication Plugin: mysql_native_password Client <-: Client Auth Plugin: caching_sha2_password Mysql ->: Auth Switch Request: Auth Method Name: mysql_native_password Client <-: Auth Switch Response Mysql ->: OKMySQL的服务器支持了Auth Switch Request的网络请求来告知客户端自己支持的认证的密码插件,而客户端会进行密码插件的支持检查,而客户端则将密码插件加密的结果返回。
3.开发起来,解决问题通过上一小节的分析,问题已经水落石出了。接下来就是如何在Doris上支持Auth Switch Request的网络请求。
3.1 确认二进制结构所以这里就需要研究这两个Auth Switch Request和Auth Switch Response的二进制包是如何组成的。这里再次借助官方文档,确认了两个包的组成:
3.2 代码开发其实到这里的工作已经很简单了,直接上笔者修改Doris的代码吧:
if (!handshakePacket.checkAuthPluginSameAsDoris(authPacket.getPluginName())) { // 1. clear the serializer serializer.reset(); // 2. build the auth switch request and send to the client handshakePacket.buildAuthSwitchRequest(serializer); channel.sendAndFlush(serializer.toByteBuffer()); // Server receive auth switch response packet from client. ByteBuffer authSwitchResponse = channel.fetchOnePacket(); if (authSwitchResponse == null) { // receive response failed. return false; } // 3. the client use default password plugin of Doris to dispose // password authPacket.setAuthResponse(readEofString(authSwitchResponse)); }就是进行了密码认证插件的校验,如果不Match Doris默认的密码认证插件的话,则构造AuthSwitchRequest发送给客户端。(笔者这里只列出了部分代码,完整的代码修改请参考如下的pr .
Coding完成之后,编译部署,进行测试,问题解决,提出issue,把解决问题的代码贡献给Doris的官方代码仓库提pr。完结撒花~~~~
4.小结Bingo! 到此为止,问题顺利解决了,希望通过和大家分享一个问题的解决流程,帮助大家梳理数据库开发之中的解决问题的思路。我们有着最大的三个帮手
搜索引擎
官方文档
源代码
而如果你遇到的是Doris的问题,那你就有第四个帮手了:百度Doris团队。(加星重点)
当然,这里也留下一个TODO的问题:支持MySQL 8.0默认的caching_sha2_password的认证方式。相较原先的mysql_native_password的认证方式,它有一定的安全性优势,但是这样可能需要重构整个Doris的密码体系了。
最后,也希望大家多多支持Apache Doris,多多给Doris贡献代码,感恩~~
5.参考资料MySQL官方文档
MySQL源代码
Apache Doris源代码