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

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.ccMySQL 服务器内置插件和 客户端库sql-common/client.c内置插件。libmysqlclient(对于内置的客户端插件,请注意 auth_plugin_t那里使用的结构与通常的客户端插件声明宏使用的结构不同。特别是,前两个成员是显式提供的,而不是由声明宏提供的。)