扩展 MySQL 8.4  /  ...  /  编写客户端身份验证插件

4.4.9.2 编写客户端身份验证插件

使用 mysql_declare_client_plugin()mysql_end_client_plugin 宏声明客户端插件描述符(参见 第 4.4.2.3 节,“客户端插件描述符”)。对于 auth_simple 插件,描述符如下所示

mysql_declare_client_plugin(AUTHENTICATION)
  "auth_simple",                        /* plugin name */
  "Author Name",                        /* author */
  "Any-password authentication plugin", /* description */
  {1,0,0},                              /* version = 1.0.0 */
  "GPL",                                /* license type */
  NULL,                                 /* for internal use */
  NULL,                                 /* no init function */
  NULL,                                 /* no deinit function */
  NULL,                                 /* no option-handling function */
  auth_simple_client                    /* main function */
mysql_end_client_plugin;

从插件名称到选项处理函数的描述符成员对于所有客户端插件类型都是通用的。(有关说明,请参阅 第 4.4.2.3 节,“客户端插件描述符”。)在通用成员之后,描述符还有一个特定于身份验证插件的成员。这是 main 函数,它处理与服务器的通信。该函数接受两个参数,分别表示 I/O 结构和连接处理程序。对于我们的简单任意密码插件,main 函数除了将用户提供的密码写入服务器之外什么也不做

static int auth_simple_client (MYSQL_PLUGIN_VIO *vio, MYSQL *mysql)
{
  int res;

  /* send password as null-terminated string as cleartext */
  res= vio->write_packet(vio, (const unsigned char *) mysql->passwd,
                         strlen(mysql->passwd) + 1);

  return res ? CR_ERROR : CR_OK;
}

main 函数应返回下表所示的错误代码之一。

错误代码 含义
CR_OK 成功
CR_OK_HANDSHAKE_COMPLETE 成功,客户端完成
CR_ERROR 错误

CR_OK_HANDSHAKE_COMPLETE 表示客户端已成功完成其部分并已读取最后一个数据包。如果身份验证协议中的往返次数事先未知,并且插件必须读取另一个数据包以确定身份验证是否完成,则客户端插件可能会返回 CR_OK_HANDSHAKE_COMPLETE