编写密码验证插件
本节介绍如何编写服务器端密码验证插件。这些说明基于plugin/password_validationMySQL源代码分发目录中的源代码。该validate_password.cc目录中的源文件实现了名为的插件validate_password。注意
在MySQL 8.0.4中,该validate_password插件已重新实现为validate_password组件。的插件形式validate_password仍然可用,但现已弃用,并将在以后的MySQL版本中删除。使用该插件的MySQL安装应过渡到使用组件。请参见“密码验证组件”。
要编写密码验证插件,请在插件源文件中包含以下头文件。根据插件的功能和要求,可能还需要其他MySQL或常规头文件。#include
plugin_validate_password.hinclude plugin.h,因此您无需显式包括后者。plugin.h定义MYSQL_VALIDATE_PASSWORD_PLUGIN服务器插件类型和声明插件所需的数据结构。plugin_validate_password.h定义特定于密码验证插件的数据结构。
与任何MySQL服务器插件一样,密码验证插件也具有通用的插件描述符(请参见“服务器插件库和插件描述符”)。在中validate_password.cc,的一般描述符validate_password如下所示:mysql_declare_plugin(validate_password)
{
MYSQL_VALIDATE_PASSWORD_PLUGIN, /* type */
&validate_password_descriptor, /* descriptor */
"validate_password", /* name */
"Oracle Corporation", /* author */
"check password strength", /* description */
PLUGIN_LICENSE_GPL,
validate_password_init, /* init function (when loaded) */
validate_password_deinit, /* deinit function (when unloaded) */
0x0100, /* version */
NULL,
validate_password_system_variables, /* system variables */
NULL,
0,
}
mysql_declare_plugin_end;
所述name构件(validate_password)指示要用于如在语句中的插件的引用名称INSTALL PLUGIN或UNINSTALL PLUGIN。这也是由INFORMATION_SCHEMA.PLUGINS或显示的名称SHOW PLUGINS。
通用描述符也指向validate_password_system_variables,该结构向SHOW VARIABLES语句公开了几个系统变量:static struct st_mysql_sys_var* validate_password_system_variables[]= {
MYSQL_SYSVAR(length),
MYSQL_SYSVAR(number_count),
MYSQL_SYSVAR(mixed_case_count),
MYSQL_SYSVAR(special_char_count),
MYSQL_SYSVAR(policy),
MYSQL_SYSVAR(dictionary_file),
NULL
};
的validate_password_init初始化函数读取字典文件如果指定一个,并且validate_password_deinit与该文件相关联的函数释放的数据结构。
validate_password_descriptor通用描述符中的值指向特定于类型的描述符。对于密码验证插件,此描述符具有以下结构:struct st_mysql_validate_password
{
int interface_version;
/*
This function returns TRUE for passwords which satisfy the password
policy (as chosen by plugin variable) and FALSE for all other
password
*/
int (*validate_password)(mysql_string_handle password);
/*
This function returns the password strength (0-100) depending
upon the policies
*/
int (*get_password_strength)(mysql_string_handle password);
};
特定于类型的描述符具有以下成员:interface_version:按照惯例,特定于类型的插件描述符以给定插件类型的接口版本开头。服务器检查interface_version何时加载插件,以参见插件是否与其兼容。对于密码验证插件,该interface_version成员的值是MYSQL_VALIDATE_PASSWORD_INTERFACE_VERSION(在中定义plugin_validate_password.h)。
validate_password:服务器调用该功能以测试密码是否满足当前密码策略。如果密码正确,则返回1,否则返回0。参数是作为mysql_string_handle值传递的密码。此数据类型由mysql_string服务器服务实现。有关详细信息,请参见目录中的string_service.h和string_service.cc源文件sql。
get_password_strength:服务器调用以评估密码强度的功能。它返回从0(弱)到100(强)的值。参数是作为mysql_string_handle值传递的密码。
对于validate_password插件,特定于类型的描述符如下所示:static struct st_mysql_validate_password validate_password_descriptor=
{
MYSQL_VALIDATE_PASSWORD_INTERFACE_VERSION,
validate_password, /* validate function */
get_password_strength /* validate strength function */
};
要编译和安装插件库文件,请使用“编译和安装插件库”中的说明。要使该库文件可供使用,请将其安装在插件目录(由plugin_dir系统变量命名的目录)中。对于该validate_password插件,当您从源代码构建MySQL时,将对其进行编译和安装。它也包含在二进制发行版中。构建过程将生成一个共享对象库,其名称为validate_password.so(.so后缀可能因平台而异)。
要在运行时注册插件,请使用以下语句(.so根据需要调整平台的后缀):INSTALL PLUGIN validate_password SONAME 'validate_password.so';
有关插件加载的更多信息,请参见“MySQL服务器插件”。
要验证插件安装,请检查INFORMATION_SCHEMA.PLUGINS表或使用以下SHOW PLUGINS语句。请参见“获取服务器插件信息”。
虽然validate_password已安装的插件,它暴露系统变量指示密码校验参数:mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name| Value|
+--------------------------------------+--------+
| validate_password_dictionary_file||
| validate_password_length| 8|
| validate_password_mixed_case_count| 1|
| validate_password_number_count| 1|
| validate_password_policy| MEDIUM|
| validate_password_special_char_count| 1|
+--------------------------------------+--------+
有关这些变量的说明,请参见“密码验证选项和变量”。
要在测试插件后禁用它,请使用以下语句将其卸载:UNINSTALL PLUGIN validate_password;