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
这里使用的结构与通常的客户端插件声明宏使用的结构不同。特别地,前两个成员是显式提供的,而不是通过声明宏提供的。)