扩展 MySQL 8.0  / 第 4 章 MySQL 插件 API  / 4.4 编写插件  / 4.4.9 编写认证插件  /  4.4.9.2 编写客户端认证插件

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 节,“客户端插件描述符”。)在公共成员之后,描述符还有一个特定于身份验证插件的附加成员。这是 主要功能,它处理与服务器的通信。该函数有两个参数,代表一个 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;
}

主函数应返回下表中显示的错误代码之一。

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

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