编写密码验证插件
本节介绍如何编写服务器端密码验证插件。这些说明基于plugin/password_validation
MySQL源代码分发目录中的源代码。该validate_password.cc
目录中的源文件实现了名为的插件validate_password
。
注意在MySQL 8.0.4中,该
validate_password
插件已重新实现为validate_password
组件。的插件形式validate_password
仍然可用,但现已弃用,并将在以后的MySQL版本中删除。使用该插件的MySQL安装应过渡到使用组件。请参见“密码验证组件”。
要编写密码验证插件,请在插件源文件中包含以下头文件。根据插件的功能和要求,可能还需要其他MySQL或常规头文件。
#include <mysql/plugin_validate_password.h>
plugin_validate_password.h
include 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_passwordSONAME '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;