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  #include  #include  .h

plugin_auth.h包括plugin.h而且plugin_auth_common.h,因此不需要显式地包括后一个文件。

本节描述如何编写一对简单的服务器和客户端身份验证插件。

警告

这些插件接受任何非空密码,密码以明文形式发送。这是不安全的,所以插件不应用于生产环境。

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

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