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

4.4.9 编写身份验证插件

MySQL 支持可插拔身份验证,其中调用插件来验证客户端连接。身份验证插件可以使用除内置方法(将密码存储在 mysql.user 系统表中)之外的其他身份验证方法。例如,可以编写插件来访问外部身份验证方法。此外,身份验证插件可以支持代理用户功能,以便连接用户充当另一个用户的代理,并在访问控制方面被视为具有不同用户的权限。有关更多信息,请参阅 可插拔身份验证代理用户

可以为服务器端或客户端编写身份验证插件。服务器端插件使用与其他服务器插件类型(例如全文解析器或审计插件)相同的插件 API(尽管具有不同的类型特定描述符)。客户端插件使用客户端插件 API。

几个头文件包含与身份验证插件相关的信息

  • plugin.h:定义 MYSQL_AUTHENTICATION_PLUGIN 服务器插件类型。

  • client_plugin.h:定义客户端插件的 API。这包括客户端插件描述符和客户端插件 C API 调用的函数原型(请参阅 C API 客户端插件接口)。

  • plugin_auth.h:定义服务器插件 API 中特定于身份验证插件的部分。这包括服务器端身份验证插件的类型特定描述符和 MYSQL_SERVER_AUTH_INFO 结构。

  • plugin_auth_common.h:包含客户端和服务器身份验证插件的常见元素。这包括返回值定义和 MYSQL_PLUGIN_VIO 结构。

要编写身份验证插件,请在插件源文件中包含以下头文件。根据插件功能和要求,可能还需要其他 MySQL 或通用头文件。

  • 对于实现服务器身份验证插件的源文件,请包含此文件

    #include <mysql/plugin_auth.h>
  • 对于实现客户端身份验证插件或同时实现客户端和服务器插件的源文件,请包含以下文件

    #include <mysql/plugin_auth.h>
    #include <mysql/client_plugin.h>
    #include <mysql.h>

plugin_auth.h 包含 plugin.hplugin_auth_common.h,因此您无需显式包含后两个文件。

本节介绍如何编写一对协同工作的简单服务器和客户端身份验证插件。

警告

这些插件接受任何非空密码,并且密码以明文形式发送。这是不安全的,因此这些插件不应在生产环境中使用。

此处开发的服务器端和客户端插件均命名为 auth_simple。如 第 4.4.2 节“插件数据结构” 中所述,插件库文件必须与客户端插件具有相同的基本名称,因此源文件名是 auth_simple.c 并生成一个名为 auth_simple.so 的库(假设您的系统使用 .so 作为库文件的后缀)。

在 MySQL 源代码分发版中,身份验证插件源代码位于 plugin/auth 目录中,可以作为编写其他身份验证插件的指南进行检查。此外,要了解如何实现内置身份验证插件,请参阅 sql/sql_acl.cc(用于内置于 MySQL 服务器中的插件)和 sql-common/client.c(用于内置于 libmysqlclient 客户端库中的插件)。(对于内置客户端插件,请注意,此处使用的 auth_plugin_t 结构与使用常用客户端插件声明宏的结构不同。特别是,前两个成员是显式提供的,而不是通过声明宏提供的。)